资料内容:
概述
据 Oracle Java SE 支持路线图显示,JDK 17 是自 Java 11 以来的首个长期支持
版本。对于 JDK 17,Oracle 官宣会提供支持到 2029 年,这给了业界一个相
当长的期许。
新特性
Java 17 的 14 个 新特性,分别是:
⚫ 306:恢复始终严格的浮点语义
⚫ 356:增强型伪随机数发生器
⚫ 382:新的 macOS 渲染管道
⚫ 391:macOS/AArch64 端口
⚫ 398:弃用即将删除的 Applet API
⚫ 403:强封装 JDK 的内部 API
⚫ 406:Switch 模式匹配(预览)
⚫ 407:删除 RMI 激活
⚫ 409:密封类
⚫ 410:删除实验性 AOT 和 JIT 编译器
⚫ 411:弃用即将删除安全管理器
⚫ 412:外部函数和内存 API(孵化器)
⚫ 414:Vector API(第二次进行特性孵化)
⚫ 415:特定于上下文的反序列化过滤器
密封类(Sealed Class)
Jdk17 之前的版本带有 final 修饰符的类是不能继承的,那如果有些情况,我们还是希望能
扩展类的功能,但是限制只有某些类能继承呢?在 Java 15 和 16 中引入了 Sealed Class
的功能预览,在 Java 17 中作为标准功能提供。Sealed Class 只允许特定的类继承。
// 只允许 Bicycle, Car, Truck 继承
public abstract sealed class Vehicle permits Bicycle, Car, Truck {...}
// Car 带有 final 修饰符,防止进一步扩展
public final class Car extends Vehicle {...}
// Truck 带有 sealed 修饰符,只允许特定的类继承public sealed class Truck extends Vehicle permits PickTruck, CyberTruck {...}
// Bicycle 带有 non-sealed 修饰符,任何类都可以继续扩展
public non-sealed class Bicycle extends Vehicle {...}
// 任意扩展 Bicycle 类
public class Motor extends Bicycle {...}
使用 Sealed Class 还有几点注意事项:
⚫ 被许可的子类,必须在编译时能被父类访问到。
⚫ 被许可的子类,必须直接继承 Sealed 父类。
⚫ 被许可的子类,必须带有 final,sealed,non-sealed 三个修饰符之一。
⚫ 被许可的子类必须在同一个 Java 模块中。
JDK 内部元素强封装
很多程序员以损害安全性和可维护性的方式使用 JDK 的内部元素比如一些非 public 类、方
法和字段。为了继续提高 JDK 的安全性和可维护性,默认强封装 JDK 的所有内部元素,从
而限制对它们的访问,除了关键的内部 API 如 sun.misc.Unsafe。