全新版本的 JDK 更新和改进了 12 项JDK 增强建议 (JEPs) 。JDK 22 将提供OpenJDK Project Amber 的语言改进(Statements before super[…]、Unnamed Variables & Patterns、String Templates 以及 Implicitly Declared Classes 和 Instance Main Methods);Project Panama 的改进(Foreign Function 以及 Memory API 和 Vector API);有关 Project Loom 的特性(Structured Concurrency 和 Scoped Values);核心库和工具功能(Class-File API、Launch Multi-File Source-Code Programs、Stream Gatherers)以及性能更新(Region Pinning for G1)。
据介绍,全新版本的JDK更新和改进了 12项JDK增强建议(JEPs),包括七个预览功能和一个孵化器功能。它们包括对Java语言、其API、其性能和JDK中包含的工具的改进。
Java 22 提供的重要更新包括:
1) 语言改进:
未命名变量和模式 - JEP 456
当需要变量声明或嵌套模式但未使用时,可以提高可读性。两者都由下划线字符表示
价值:
捕获开发人员意图,即给定的绑定或lambda参数未使用,并强制执行该属性以澄清程序并减少出错机会。
通过识别必须声明(例如,在 catch 子句中)但未使用的变量,提高所有代码的可维护性。
如果多个模式都没有声明任何模式变量,则允许在单个案例标签中出现多个模式。
通过省略不必要的嵌套类型模式来提高记录模式的可读性。
1.1) 语言预览
super之前的语句(…)【预览】- JEP 447:
在构造函数中,允许在显式构造函数调用之前出现不引用正在创建的实例的语句。
价值:
赋予开发人员更大的自由度来表达构造函数的行为,使当前必须分解为辅助静态方法、辅助中间构造函数或构造函数参数的逻辑能够更自然地放置。
保留现有的保证,即在类实例化期间构造函数以自上而下的顺序运行,确保子类构造函数中的代码不会干扰超类实例化。
不需要对Java虚拟机进行任何更改。此Java语言功能仅依赖于JVM验证和执行在构造函数内显式构造函数调用之前出现的代码的当前能力。
字符串模板(第二版预览)- JEP 459:
字符串模板通过将文本与嵌入式表达式和模板处理器结合,以产生特殊的结果,从而补充了Java现有的字符串字面量和文本块。
价值:
通过简化包含运行时计算值的字符串的表达方式,简化了Java程序的编写。
增强混合文本和表达式的表达式的可读性,无论文本是适合单个源行(如字符串文字)还是跨多个源行(如文本块)。
通过支持对模板及其嵌入式表达式的值进行验证和转换,提高了从用户提供的值中组合字符串并将其传递给其他系统(例如,构建数据库查询)的Java程序的安全性。
通过允许Java库定义在字符串模板中使用的格式化语法来保持灵活性。
简化了接受非Java语言编写的字符串(例如,SQL、XML和JSON)的API的使用。
允许创建从文本和嵌入式表达式计算得出的非字符串值,而无需通过中间字符串表示形式进行转换。
隐式声明类和实例主方法(第二版预览)- JEP 463:
学生可以编写他们的第一个Java程序,而无需理解专为大型程序设计的语言特性。学生可以编写单类程序的简化声明,而不是使用语言的单独方言,然后随着技能的增长,可以无缝地扩展他们的程序以使用更高级的特性。
价值:
为了便捷的学习Java ,为Java编程提供了平滑的入门途径,以便大家能够以渐进的方式引入概念。
帮助大家以简洁的方式编写基本程序,并随着技能的增长逐渐完善自己的代码。
减少了编写简单程序(如脚本和命令行实用程序)的仪式。
不会引入单独的Java语言初学者方言。
不引入单独的初学者工具链以及程序应该使用编译和运行任何Java程序的相同工具进行编译和运行。
2) 图书馆
外部函数和内存API - JEP 454:
允许Java程序与Java运行时之外的代码和数据交互操作。通过高效地调用外部函数(即JVM之外的代码),以及安全地访问外部内存(即非JVM管理的内存),该API使Java程序能够调用本地库和处理本地数据,而没有JNI的脆弱性和危险性。
价值:
生产力 — 用简洁、可读且纯Java的API替换本地方法和Java本地接口(JNI)的脆弱机制。
性能 — 提供对外部函数和内存的访问,其开销与 JNI 和 sun.misc.Unsafe 相当,甚至更低。
广泛的平台支持 — 在运行JVM的每个平台上启用本地库的发现和调用。
一致性——提供在多种内存(例如,本机内存、持久内存和托管堆内存)中操作结构化和非结构化数据的方法,且数据大小不受限制。
健全性——保证没有使用后释放的错误,即使内存是在多个线程之间分配和释放的。
完整性 — 允许程序使用本机代码和数据执行不安全的操作,但默认情况下会警告用户此类操作。
2.1) 库预览和孵化器
类文件API(预览版)- JEP 457:
提供了一个标准的API,用于解析、生成和转换Java类文件。
价值:
API允许依赖它的框架和程序自动支持来自最新JDK的最新类文件,以便可以快速轻松地采用在类文件中表示的新语言和VM功能。
流收集器(预览版)- JEP 461:
增强了Stream API以支持自定义中间操作。这将允许流管道以现有内置中间操作不易实现的方式转换数据。
价值:
通过使流中的常见自定义操作更加灵活和富有表现力,提高了开发人员的生产力和代码的可读性。尽可能地允许中间操作处理无限大小的流。
结构化并发(第二版预览)- JEP 462:
简化了并发编程。结构化并发将不同线程中运行的相关任务组视为单个工作单元,从而简化了错误处理和取消,提高了可靠性,并增强了可观察性。
价值:
通过推广一种编程风格来简化并发代码的开发,这种风格可以消除由取消和关闭引起的常见风险,如线程泄漏和取消延迟,并提高并发代码的可观察性。
作用域值(第二版预览)- JEP 464:
实现在线程内和线程间高效共享不可变数据。
价值:
易于使用 — 提供了一个编程模型,用于在线程内和子线程之间共享数据,以简化数据流的推理。
可理解性——使共享数据的生命周期从代码的语法结构中可见。
健壮性——确保调用者共享的数据只能由合法的被调用者检索。
性能 — 将共享数据视为不可变数据,以允许大量线程共享,并启用运行时优化。
向量API(第七孵化器)- JEP 460:
一个表达向量计算的API,它能在运行时可靠地编译成支持的CPU架构上的最优向量指令,从而获得比等效标量计算更优越的性能。
这个JEP提议在JDK 22中重新孵化API,与JDK 21相比,API有小幅增强。实现包括bug修复和性能增强。我们包括以下值得注意的变化:
支持使用由任何原始元素类型数组支持的堆内存段进行向量访问。以前,访问仅限于由字节数组支持的堆内存段。
价值:
提供了一个清晰简洁的API,能够清晰简洁地表达由循环内组成的向量操作序列组成的各种向量计算,并可能带有控制流。
该API被设计为与CPU架构无关,支持在支持向量指令的多种架构上实现。
在x64和AArch64架构上提供可靠的运行时编译和性能。
与瓦尔哈拉项目一致。
3) 性能表现
G1的区域锁定 - JEP 423:
通过在G1中实现区域固定来减少延迟,这样在Java本地接口(JNI)关键区域中就不需要禁用垃圾收集。
价值:
通过消除在使用 JNI 时 Java 线程在 G1 GC 操作完成之前等待的需要,提高了开发人员的生产力。
4) 工装
启动多文件源代码程序 - JEP 458:
允许用户运行以多个Java源代码文件形式提供的程序,而无需先编译它。
价值:
通过使从小程序到大型程序的过渡更加渐进,提高开发人员的生产力,使开发人员能够选择是否以及何时费心配置构建工具。
请注意,预览功能在Java SE平台的编程语言或虚拟机功能中已完全指定并完全实现,但并非永久性的。它们在JDK功能发布中可用,以便在未来的版本中成为永久性功能之前,允许开发人员根据实际使用情况提供反馈。这也为工具供应商提供了在功能最终确定为Java SE标准之前支持这些功能的机会。
孵化器模块中的API将非最终API和非最终工具交到开发人员和用户手中,以收集反馈,最终提高Java平台的质量。
除了 JEP 中描述的更改外,发行说明中还列出了许多较小的更新,这些更新将引起许多应用程序开发人员和系统管理员的兴趣。其中包括弃用过时的 API 以及删除以前已弃用的 API。
Java 22 发布说明中的一些关键更新:
向keytool和jarsigner添加额外的算法。
垃圾回收器吞吐量改进,特别是与“年轻”垃圾相关的改进。
系统模块描述符的版本报告得到改进。
改进了本机代码的“等待”处理选项。
Unicode 通用区域设置数据仓库已更新到版本 44。
类型注释支持从字节码加载的类型。
ForkJoinPool和ForJoinTasks现在可以更好地处理不可中断的任务。
配置客户端与服务器TLS连接属性的灵活性更高。
改进了本机内存跟踪,包括报告峰值使用情况的能力。
最后,像所有功能版本一样,JDK 22 包括数百项性能、稳定性和安全更新,包括适应底层操作系统和固件更新以及标准。有关 Java 22 特性的更多信息,请阅读: Java 22 技术博客文章https://blogs.oracle.com/java/post/the-arrival-of-java-22。