Java17 更新内容一览:

JDK 17 增加了新的语言增强功能,对库进行更新,支持新款 Apple 计算机,移除和弃用旧功能,并且确保用户编写的 Java 代码在未来的 JDK 版本中可以继续正常工作。此外,JDK 17 还提供语言功能预览版和孵化阶段的 API,以收集来自 Java 社区的反馈。具体更新内容包括:

■  Java 语言增强功能

● JEP 409:密封类 — 密封类和接口限制其他类或接口扩展或实现它们。此增强功能是Project Amber的又一项改进,旨在通过发展 Java 语言来提高开发人员的生产力。

■  对库进行更新和优化

● JEP 306:恢复始终严格的浮点语义 — Java 编程语言和 Java 虚拟机最初只有严格的浮点语义,从 Java 1.2 开始,为了适应当时硬件架构的限制,曾默认允许这些严格语义中的细微变化。现在不再需要这些变化,已在 JEP 306 删除。

● JEP 356:增强型伪随机数生成器 — 增加伪随机数生成器 (PRNG) 的新接口类型和实现方法,提高了不同 PRNG 的互操作性,并且易于根据需求请求算法,而不是对特定实现进行硬编码。

● JEP 382:新的 macOS 渲染管道 — 通过使用新的 Apple Metal API 为 macOS 实现 Java 2D 渲染管道,减少了 JDK 对已弃用的 Apple OpenGL API 的依赖。

■  支持新平台

● JEP 391:macOS AArch64 端口 — 将 JDK 移植到 macOS/AArch64 平台,Java 应用可以原生运行于基于 Arm 64 的新 Apple Silicon 计算机。

■  移除和弃用

 JEP 398:弃用即将移除的 Applet API — 所有 Web 浏览器供应商正计划或已经停止支持 Java 浏览器插件。Applet API 已于 2017 年 9 月在 Java 9 中弃用,但并未移除。

● JEP 407:移除 RMI 激活 — 移除远程方法调用 (RMI) 激活机制,保留其他 RMI。

● JEP 410:移除实验性的 AOT 和 JIT 编译器 — 基于 Java 的提前 (AOT) 和即时 (JIT) 实验性编译器并未被广泛采用。作为一个选择性功能,AOT 和 JIT 编译器已在 JDK 16 中移除,本次在 JDK 源代码中移除。

● JEP 411:弃用即将删除的安全管理器 — 从 Java 1.0 开始,安全管理器一直都不是保护客户端 Java 代码的主要手段,也很少用于保护服务器端代码。在未来的版本中会移除安全管理器,以消除大量维护负担,让 Java 平台能够向前发展。

■  面向未来的Java程序

● JEP 403:JDK 内部强封装 — 用户再也不能像在 JDK 9 到 JDK 16 中一样,通过单个命令行选项来放宽对内部元素的强封装。用户仍然可以访问现有的内部 API ,但需要以命令行参数形式或 JAR 文件清单属性进行枚举,且每个包应该放宽封装。此更改将使应用程序更安全,并减少对非标准、内部 JDK 实现细节的依赖。

■  未来JDK发行版的预览版和孵化器

● JEP 406:Switch 模式匹配(预览版)— 允许Switch表达式针对多个模式进行测试,每个模式都有特定的操作,从而简洁、安全地表达面向数据的复杂查询。

● JEP 412:外部函数和内存 API(孵化阶段)— 改进 JDK 14 和 JDK 15 中引入的孵化 API,让 Java 程序与 Java 运行时之外的代码和数据进行互操作。通过有效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存,这些 API 可以调用本地库和处理本地数据,并且不受 Java 本机接口 (Java Native Interface, JNI) 的脆弱性和复杂性影响。这些 API 正在Project Panama中开发,目的是改进 Java 和非 Java 代码之间的交互性。

● JEP 414:矢量 API(二次孵化阶段)— 允许以一种在运行时,可靠地编译为支持的 CPU 架构上的最佳向量指令的方式表达向量计算,从而实现优于等效标量计算的性能。