JDK 14发布,空指针错误改进正式落地
自 2019 年 9 月 17 日 Java 13 发布之后,Java 新版发布节奏就按照六个月一个新版的传统,新的一个非 LTS (long term support) 版本 Java 14,于 2020 年 3 月 17 日发布。
以下是 Java 14 主要新特性:
switch 表达式(标准)— JEP 361
instanceof 的模式匹配(预览)— JEP 305
有帮助信息的 NullPointerExceptions — JEP 358
Record(预览)— JEP 359
文本块(预览2)— JEP 368
Package 工具(孵化)— JEP 343
G1 的 NUMA 感知内存分配— JEP 345
JFR 事件流-JEP 349
非易失性映射字节缓冲区— JEP 352
Mac OS 上的 ZGC — JEP 364
Windows 上的 ZGC-JEP 365
外部存储器访问API(孵化)— JEP 370
有用的NullPointerExceptions
Switch 表达式
在最近两个版本(Java 12 和 Java 13)中作为预览功能之后,Switch 表达式 终于在 Java 14 中正式支持了。
Java 12 为 switch 表达式引入了 lambda 语法,从而允许使用多个大小写标签进行模式匹配,并防止出现导致冗长代码的错误。它还强制执行穷尽的 case 检查,如果不涵盖所有 case 可能,将引发编译错误。
Java 13,第二个预览版引入了 yield 语句,而不是使用 break 从表达式返回值。
Java 14 终于让这些特性成为标准。
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
System.out.println(result);
注意:yield 不是 Java 新关键字。它仅用于开关表达式中。
instanceof 模式匹配(预览功能)
访问任何 Java 开发人员的代码库,你会看到 instanceof 在代码中大量使用。具体来说,instanceof 通常会在条件检查之后进行显式类型转换。
Java 14 通过使条件提取,更加简洁地摆脱了这种冗长的写法。
在 Java 14 之前:
if (obj instanceof Article) {
Article a= (Article) obj;
System.out.println(a.getAuthor());
}
Java 14 及更高版本:
if (obj instanceof Article a) {
System.out.println(a.getAuthor());
}
在上面的代码中,a 只有 obj 类型为 Article 的实例才会被赋值。变量的范围仅限于条件块。
新的空指针错误信息
空指针异常是任何开发人员的噩梦。直到 Java 13 为止,调试臭名昭著的 NPE 都很棘手。
开发人员必须依靠其他调试工具,或者手动判断各个值是否为空的方法,因为堆栈跟踪只会显示行号。
在 Java 14 之前:
String name = a.getBlog().getAuthor()
//Stacktrace
Exception in thread "main" java.lang.NullPointerException at NullPointerExample.main(NullPointerExample.java:5)
Java 14 引入了新的 JVM 特性,它的堆栈输出信息更具描述性,如下所示:
Exception in thread "main"
java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Article.getBlog()" is null at NullPointerExample.main(NullPointerExample.java:4)
注意:以上功能不是语言特性,而是运行时环境的增强。
Record (预览)
Record 是存储数据的类,引入 Record 背后的想法是,快速创建没有八股文的简洁类。
通常,Java 实体类需要实现 equals(),hashCode() 以及一堆 getters 和 setters 方法。尽管某些 IDE 支持这些代码的自动生成,但是代码仍然很冗长。使用 record,只需按照以下方式简单地定义一个类。
record Author(){}
//or
record Author (String name, String topic) {}
Java 编译器将自动生成构造函数,private final 字段,setter/getter,equals / hashCode toString() 等方法。上例自动生成的 getter 方法是 name() 和 topic()。
Record 的语义非常类似 Kotlin 中的数据类。
译者注:更多了解 Record 及其他 JDK 14 特性介绍,可参阅原文:
https://medium.com/better-programming/whats-new-java-14-features-6b5856c94aa4
参考阅读:
高可用架构
改变互联网的构建方式