2020年2月3日,第四届OpenJDK Committers研讨会将在比利时的布鲁塞尔举行,与此同时Java 14即将迎来初始发行,这个版本有几个大家等了很多很多年的语法糖,首先搬运翻译一下OpenJava官方公布的说明
Java 14的Schedule:
| Date | Events |
|---|---|
| 2019/12/12 | 第一阶段 |
| 2020/01/16 | 第二阶段 |
| 2020/02/06 | 初始发行 |
| 2020/02/20 | 最终发行 |
| 2020/03/17 | 发布 (可用) |
java 14的新特性
- 305: instanceof模式匹配
- 343: 新打包工具
- 345: G1(垃圾回收)中NUMA-Aware的内存分配
- 349: 提供JFR(JVM内置的性能记录器)事件流
- 352: 非易失性映射字节缓冲区(IO优化)
- 358: NPE优化(NullPointerExceptions)
- 359: 类声明优化(新关键字record)☆
- 361: switch语法优化☆
- 362: 弃用Solaris / SPARC,Solaris / x64和Linux / SPARC端口
- 363: 弃用并发标记扫描(CMS)垃圾回收器
- 364: Mac OS上的ZGC(垃圾回收优化)
- 365: Windows上的ZGC(垃圾回收优化)
- 366: 弃用ParallelScavenge + SerialOld GC(垃圾回收优化)
- 367: 弃用Pack200工具和API
- 368: 文本块(字符串优化)☆
- 370: 提供外部存储器API
其中359,361,368部分是非常值得期待的。其实,361和368在Java 13中就已经有了,只不过都是Preview版。
这个版本确定了361,也就是switch的语法,switch已经饱受诟病很多年了,在《Refactoring:Improving the Design of Existing Code》(中译:重构:改善既有代码的设计)一书中,就指出了switch的很多问题,很多开发人员也倾向于选择if...else...,而非switch。
冗长的switch:
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
361使switch变得简便可读
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
另一个特性是368,字符串值的优化,与C#的@ string相比,实在拖了太久太久了,就这还是抄groovy的(抄完C#抄groovy,java大概练了乾坤大挪移),而且只是进入到了Second Preview的阶段,还有一些细节可能还要等到下个版本才能拍板。
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
最后是359,java中声明一个实体实在要做太繁琐了,像祭天仪式一样,Records终于出现了,感觉救了全人类,平均下来,一个码农能少写几吨代码,字段私有,提供get set访问器,五花八门的code generate拜拜了,lombok都可以不要了,不过这只是Preview阶段
record Point(int x, int y) { }