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