Java 中 Null 的设计并不是一个错误

我使用 Java 开发项目很多年了,了解如何用它来开发大型的项目。在工业界,我看到大家做了很多努力来规避 NullPointerException(NPE),对其胆战心惊。NPE 的发明人 Tony Hoare 在 2009年承认:「null 引用的设计是一个十亿美元的错误」。

我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我的目的是确保所有引用的使用都是绝对安全的,编译器会自动进行检查。但是我未能抵御住诱惑,加入了null引用,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。近年来,大家开始使用各种程序分析程序,比如微软的 PREfix 和 PREfast 来检查引用,如果存在为非 null 的风险时就提出警告。更新的程序设计语言比如 Spec# 已经引入了非 null 引用的声明。这正是我在1965年拒绝的解决方案。” —— 《Null References: The Billion Dollar Mistake》托尼·霍尔(Tony Hoare),图灵奖得主。

阅读更多

Kubernetes Scheduler 源码全解析(附流程图)

最近的一个项目,需要对 kube-scheduler 进行改造,因此就系统性地阅读了下它的源码。几点阅读感受:

  1. Scheduler 的代码整体上代码可读性较好,不同的逻辑之间做了较好的解耦;
  2. 可能正是在设计之初,就想把调度模块做彻底解耦,因此该模块内外都存在一些问题:
    • 我阅读的 Kubernetes 版本(v1.6.6)里 Scheduler 模块位于 plugin 目录下,在最新的 Kubernetes 中,Scheduler 的主体已经被从 plugin 目录移出,和其他组件处于同一目录下;
    • Scheduler 模块代码中存在若干过度设计,当然这只是个人观点;
  3. GO 语言的设计增加了语言的灵活性,但一定程度上也降低了代码的可读性,最简单的例子就是接口;

Scheduler 是什么

Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心。Scheduler(下称 kube-scheduler ) 在 Kubernetes 架构 中的位置如下图所示:

阅读更多

ClassLoader类加载过程浅析

类加载概述

概述

定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。

类加载分为 加载(Loading)验证(Verfication)准备(Preparation)解析(Resolution)初始化(Initialization)使用(Using)卸载(Unloading) 这 7 个阶段。

阅读更多

SpringBoot 启动 Scala 项目:NoClassDefFoundError

今天尝试将一个 scala 项目转为 springboot 项目时,出现了无法找到主类的报错,现象如下:

  1. 在 IDEA 里面新建 SpringBoot 启动配置,运行后启动成功。
  2. 在 POM 目录 执行 mvn spring-boot:run 运行项目,启动成功;
  3. 线下环境 通过 java -jar jar_name.jar,运行成功;
  4. 线上脚本启动时(事实上也是运行的 java -jar…),抛出异常:
阅读更多

Spring测试用例自动注入Bean(下)

如果Bean的初始化是通过 xml 进行的,可以参考文章:Spring测试用例自动注入Bean(上),下面讲到的是「在没有 xml配置文件时,如何测试诸如 @Component @Service @Repository 等注解标识的类」。

待测试的类,注意该 Bean 有一个 init() 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class DemoService {

/* 初始化逻辑*/
@PostConstruct
public void init() {
// initialization code
}

public void printName() {
System.out.println("I'm Yves");
}
}
阅读更多

Java 9新特性尝鲜

Java 9版本于2017年9月21日发布,本文将主要介绍Java 9中引入的若干新特性。在介绍之前,还是很必要回顾一下Java 8发布的内容,毕竟Java 9中的若干新特性(例,Stream 流处理)也是在前者基础上的展开的。

Java 8特性回顾

Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。主要有:

阅读更多

点点滴滴步步为营系列4

点点滴滴步步为营系列3

点点滴滴步步为营系列2

点点滴滴步步为营系列1


:D 一言句子获取中...