搂一眼 Java 14 的新特性,提升下职业素养

2020-03-24  

估计很多人都跟我一样,Java 8 的新特性还没搞明白,这 Java 14 就发布了。学习节奏妥妥滴跟不上 Java 的版本更新...

 

不用归不用,但是 Java 14 的新特性还是需要了解下的。跟同事在一起吃饭聊天的时候,也好装个逼。

 

先看下 Oracle JDK 14 的更新说明:

https://www.oracle.com/technetwork/java/javase/14all-relnotes-5809668.html

页面内容很长,主要说了:

新增和增强的功能
    核心类库:
        会计货币格式支持
        添加了一个新类java.lang.Record
        阐明 ReadableByteChannel.read()方法和其他相关方法的规范

    hotspot 虚拟机中的垃圾收集器:
        垃圾收集器 ZGC 在 Windows、MacOS 的使用
        并行 GC 的改进
        G1 垃圾收集器对 NUMA-Aware 内存分配的支持

    安全类库:
        默认情况下禁用TLS、CertPath和Signed JAR中的弱命名曲线
        Apache Santuario 库更新到版本 2.1.4

    工具 javac:
        默认情况下允许调用可发现的 javac 插件

    ml/jaxp:
        SAX ContentHandler 处理 XML 声明的新方法

删除的功能与选项
    删除 sun.nio.cs.map 系统属性
    删除 netscape.javascript.JSObject::getWindow 方法
    删除并发标记和清除(CMS)垃圾收集器
    删除不推荐使用的 java.security.acl api
    删除 keytool -keyalg 的默认值
    移除 Pack200 工具和 API


还包括:不推荐使用的功能、注意事项。最后补充了 Oracle JDK 与 Oracle Open JDK 之间的差异。

 

 

官方有篇博客举例说明了 Java 14 的新特性:

https://blogs.oracle.com/javamagazine/java-14-arrives-with-a-host-of-new-features

  • Switch Expressions(switch 表达式可以使用箭头语法)
switch (event) {
    case PLAY -> "User has triggered the play button";
    case STOP, PAUSE -> "User needs a break";
    default -> {
        String message = event.toString();
        LocalDateTime now = LocalDateTime.now();
        yield "Unknown event " + message + 
              " logged on " + now;
    }
};

 

  • Text Blocks(文本块)
String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";

JDK 14 可以这样

String html = """
<HTML>
  <BODY>
    <H1>"Java 14 is here!"</H1>
  </BODY>
</HTML>""";

 

  • Pattern Matching for instanceof(instanceof 的匹配优化)
if (obj instanceof Group) {
  Group group = (Group) obj;

  // use group specific methods
  List entries = group.getEntries();
}

JDK 14 可以这样

if (obj instanceof Group group) {
  List entries = group.getEntries();
}

 

  • Records(预览功能,减少冗余代码)

 

  • Helpful NullPointerExceptions(NullPointerException 更详细的错误信息打印)
//JDK 空指针代码与 JVM 打印日志
String name = user.getLocation().getCity().getName();

Exception in thread "main" java.lang.NullPointerException
    at NullPointerExample.main(NullPointerExample.java:5)

JDK 14 日志可以这样,提示更准确

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is null
    at NullPointerExample.main(NullPointerExample.java:5)

 

 

再来看一下 OpenJDK 里 JDK 14 的新特性:

https://openjdk.java.net/projects/jdk/14/

  • 305:Pattern Matching for instanceof (Preview)
  • 343:Packaging Tool (Incubator)
  • 345:NUMA-Aware Memory Allocation for G1
  • 349:JFR Event Streaming
  • 352:Non-Volatile Mapped Byte Buffers
  • 358:Helpful NullPointerExceptions
  • 359:Records (Preview)
  • 361:Switch Expressions (Standard)
  • 362:Deprecate the Solaris and SPARC Ports
  • 363:Remove the Concurrent Mark Sweep (CMS) Garbage Collector
  • 364:ZGC on macOS
  • 365:ZGC on Windows
  • 366:Deprecate the ParallelScavenge + SerialOld GC Combination
  • 367:Remove the Pack200 Tools and API
  • 368:Text Blocks (Second Preview)
  • 370:Foreign-Memory Access API (Incubator)

跟 Oracle JDK 14 发布的内容相似。

 

关于 JDK 的选择要考虑的点

  • 建议使用 LTS 版本,即官方长期支持版,会一直更新到承诺维护截止日期
  • 由于商业成本和软件协议,高于 JDK 8,尽量使用 OpenJDK

 

ConstXiong 备案号:苏ICP备16009629号-3