JDK 15 的新特性

JDK 15 在2020年9月15号发布了。本文简单介绍一下 JDK 15 的新特性。对于其中的重要特性,会在另外的文章中进行详细介绍。

使用 SDKMAN 来安装JDK 15。

$ sdk install java 15.0.0.hs-adpt
$ sdk use java 15.0.0.hs-adpt

查看 JDK 的版本。

$ java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment AdoptOpenJDK (build 15+36)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15+36, mixed mode, sharing)

下面根据 JDK 15 中包含的 JEP 来进行介绍。

JEP 339 - EdDSA 签名算法

一种新的加密算法(Edwards-Curve Digital Signature Algorithm,EdDSA)。EdDSA 是 TLS 1.3 规范所允许的 3 种签名算法中的一种(另外两种是 RSA 和 ECDSA)。支持 EdDSA 算法可以满足 TLS 1.3 规范的要求。

JEP 360 - 密封类和接口

密封类和接口是 JDK 15 的一个预览功能,它的作用是限制对类的继承和对接口的实现。类继承和接口实现是面向对象语言中的基本特征。通过继承机制,子类可以复用父类中的行为。在密封类和接口被引入之前,我们只能通过两种方式来限制继承。

  • 把类声明为 final,禁止了对该类的继承。
  • 把类或它的构造器声明为包私有(package private),只允许同一个包中的类来继承。

密封类和接口通过 sealed 来声明,并使用 permits 来声明允许的子类。下面代码中的 密封类 Shape,仅允许 3 个子类 CircleRectangleSquare

public abstract sealed class Shape permits Circle, Rectangle, Square {

}

一个密封类所允许的子类存在一些限制:

  • 密封类及其子类要么在同一个模块中,要么在未命名模块的同一个包中。
  • 每个允许的子类都必须直接继承自密封类。
  • 每个允许的子类都需要选择一种修饰符来描述当前子类的密封行为。
    • 允许的子类可以声明为 final 来禁止进一步继承。
public final class Circle extends Shape {

}
  • 允许的子类可以声明为 sealed 来继续限制它的子类。
public sealed class Rectangle extends
    Shape permits TransparentRectangle, FilledRectangle {

}
  • 允许的子类可以声明为 non-sealed 来转换成普通的开放类。
public non-sealed class Square extends Shape {

}

JEP 371 - 隐藏类

隐藏类不能直接被其他类的字节代码所使用。隐藏类的设计目的是为了框架在运行时生成类文件,并通过反射来使用。

JEP 372 - 删除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎及其 API和 jjs 工具,已经在 Java 11 中被废弃,在 JDK 15 中被移除。

JEP 373 - 重新实现 DatagramSocket API

java.net.DatagramSocketjava.net.MulticastSocket 的内部实现被替换成更加现代的实现,方便进行维护和调试。

JEP 374 - 禁用并废弃偏好加锁

默认禁用 HotSpot 虚拟机的偏好加锁(biased locking)特性,并废弃该功能。

JEP 377 - ZGC

ZGC 垃圾回收器在 JDK 11 中以试验式功能的方式引入,在 JDK 15 中作为正式的产品功能。这就意味着不需要使用 -XX:+UnlockExperimentalVMOptions 选项来启用。

JEP 378 - 文本块

文本块最早在 JDK 13 中作为预览功能引入,并在 JDK 14 中做了修改。在 JDK 15 中,文本块已经成为正式功能,与 JDK 14 相比没有改动。

文本块使用 3 个双引号来包围多行的字符串,如下面的代码所示。

String xml = """
    <root>
      <a>Test</a>
      <b>123<b>
    </root>
  """;

JEP 379 - Shenandoah 垃圾回收器

Shenandoah 垃圾回收器在 JDK 12 中以试验式功能的方式引入,在 JDK 15 中作为正式的产品功能。这就意味着不需要使用 -XX:+UnlockExperimentalVMOptions 选项来启用。

JEP 381 - 移除对 Solaris 和 SPARC 的支持

与 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 支持相关的源代码和构建支持,已经在 JDK 14 中被废弃,在 JDK 15 中被移除。

JEP 383 - 外部内存地址访问AP (第二个孵化版)

该JEP引入了一种安全高效的API来访问外部内存地址。目前该API处于孵化状态。

JEP 384 - 记录类型(第二个预览版)

记录类型在 JDK 14 中作为预览功能引入,在 JDK 15 中,该功能仍然为预览的,同时增加了对局部记录类的支持。局部记录类声明在方法体中。

下面代码中的 GeoLocation 是记录类型的一个示例。

public record GeoLocation(double lat, double lng) {

  @Override
  public String toString() {
    return String.format("%.7f,%.7f", this.lat, this.lng);
  }
}

JEP 385 - 废弃 RMI 激活机制

RMI 激活机制是 RMI 的一部分,在 Java 8 就已经变为可选的项目。JDK 15 把该机制声明为废弃的,并在今后的版本中删除。

版权所有 © 2024 灵动代码