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 个子类 Circle
、Rectangle
和 Square
。
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.DatagramSocket
和 java.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 把该机制声明为废弃的,并在今后的版本中删除。