Unveiling the new features for Java 14!

229 阅读3分钟

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) { }