JDK 22 和 JDK 23:到目前为止我们所知道的
Oracle Java 平台组首席架构师Mark Reinhold宣布, JDK 22是自JDK 21以来的第一个非 LTS 版本,现已进入第二个候选版本阶段。主线源代码存储库于 2023 年 12 月中旬(Rampdown 第一阶段)分叉到 JDK稳定存储库,定义了 JDK 22 的功能集。可以解决诸如回归或严重功能问题之类的关键错误,但必须解决这些问题。通过修复请求流程获得批准。根据发布时间表,JDK 22将于2024年3月19日正式发布。
最终的 12 个新功能集(以JEP的形式)可分为四 (4) 类:核心 Java 库 、Java 语言规范 、HotSpot 和Java 工具。
其中六 (6) 个新功能属于核心 Java 库:
- JEP 454:外部函数和内存 API
- JEP 457:类文件 API(预览版)
- JEP 460:Vector API(第七个孵化器)
- JEP 461:流收集器(预览)
- JEP 462:结构化并发(第二预览版)
- JEP 464:范围值(第二预览版)
其中四 (4) 个新功能属于Java 语言规范:
- JEP 447:super(...) 之前的语句(预览)
- JEP 456:未命名变量和模式
- JEP 459:字符串模板(第二次预览)
- JEP 463:隐式声明的类和实例主要方法(第二预览版)
其中一 (1) 个新功能属于HotSpot类别:
- JEP 423:G1 的区域固定
最后,其中一 (1) 个新功能被归类为Java 工具:
- JEP 458:启动多文件源代码程序
我们研究了其中一些新功能,并包括它们在四个主要 Java 项目( Amber、Loom、Panama和Valhalla )支持下的位置,这些项目旨在孵化一系列组件,以便通过精心策划的合并最终包含在 JDK 中。
Project Amber
JEP 463,隐式声明的类和实例主方法(第二预览版),以前称为未命名类和实例主方法(预览) 、灵活的主方法和匿名主类(预览)以及隐式类和增强的主方法(预览) ,合并了针对上一轮预览的反馈进行了增强,即 JEP 445、未命名类和实例主要方法(预览)。该 JEP 提议"发展 Java 语言,以便学生可以编写他们的第一个程序,而无需了解为大型程序设计的语言功能。" 此功能推进了Oracle Java 语言架构师Brian Goetz于 2022 年 9 月发布的博客文章"铺平入口" 。Oracle 技术顾问成员Gavin Bierman发布了规范文档的初稿,供 Java 社区审查。有关 JEP 445 的更多详细信息可以在 InfoQ新闻报道中找到。
JEP 459,字符串模板(第二次预览),提供了第一轮预览的第二次预览:JEP 430,字符串模板(预览) ,在 JDK 21 中提供。此功能通过字符串模板 (包含嵌入的字符串文字)增强了 Java 编程语言表达式,在运行时解释,其中嵌入的表达式被评估和验证。有关 JEP 430 的更多详细信息可以在 InfoQ新闻报道中找到。
JEP 456,未命名变量和模式,建议在上一轮预览之后最终确定此功能:JEP 443,未命名模式和变量(预览) ,在 JDK 21 中提供。此功能将"使用未命名模式 增强语言,该模式与记录组件,但不说明组件的名称或类型,以及未命名的变量 ,可以初始化但不能使用。" 这两者都由下划线字符表示,如**r instanceof _(int x, int y)
和中 r instanceof _
**。
JEP 447,super(...) 之前的语句(预览版)建议:允许不引用正在创建的实例的语句出现在构造函数中的**this()
or调用之前; super()
**并保留构造函数现有的安全性和初始化保证。Bierman 还提供了此功能的初始规范,供 Java 社区审查并提供反馈。
Project Loom
JEP 464,Scoped Values (Second Preview),以前称为Extent-Local Variables (Incubator) ,提出了第二次预览,不做任何更改,以便从一轮孵化和一轮预览中获得额外的经验和反馈:JEP 446 ,范围值(预览版),在 JDK 21 中提供;以及 JEP 429,范围值(孵化器),在 JDK 20 中提供。此功能支持在线程内和线程间共享不可变数据。这比线程局部变量更可取,特别是在使用大量虚拟线程时。
JEP 462,结构化并发(第二个预览版),提出第二个预览版,不做任何更改,以便从上一轮预览中获得更多反馈:JEP 453,结构化并发(预览版),在 JDK 21 中提供。此功能简化了并发编程通过引入结构化并发来"将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消、提高可靠性并增强可观察性"。
Project Panama
JEP 460,Vector API(第七个孵化器),根据前六轮孵化的反馈进行了增强:JEP 448,Vector API(第六个孵化器),在 JDK 21 中交付;JEP 438,Vector API(第五孵化器),在 JDK 20 中交付;JEP 426,Vector API(第四个孵化器),在 JDK 19 中交付;JEP 417,Vector API(第三孵化器),在 JDK 18 中交付;JEP 414,Vector API(第二孵化器),在 JDK 17 中交付;JEP 338,Vector API(孵化器) ,作为 JDK 16 中的孵化器模块提供。JEP 448 中最显着的变化包括对JVM 编译器接口(JVMCI)的增强,以支持 Vector API 值。
JEP 454,外部函数和内存 API,建议经过两轮孵化和三轮预览后最终确定此功能:JEP 412,外部函数和内存 API(孵化器),在 JDK 17 中交付;JEP 419,外部函数和内存 API(第二孵化器),在 JDK 18 中交付;JEP 424,外部函数和内存 API(预览版),在 JDK 19 中交付;JEP 434,外部函数和内存 API(第二预览版),在 JDK 20 中交付;以及 JEP 442,外部函数和内存 API(第三个预览版),在 JDK 21 中提供。自上一个版本以来的改进包括: 一个新的**Enable-Native-Access
清单属性,允许可执行 JAR 中的代码在不使用标志的情况下调用受限制的方法 --enable-native-access
**;允许客户端以编程方式构建 C 函数描述符,避免特定于平台的常量;改进了对本机内存中可变长度数组的支持;并支持本机字符串中的多个字符集。有关 JEP 454 的更多详细信息可以在 InfoQ新闻报道中找到。
JDK 23
计划于 2024 年 9 月发布 GA,目前只有一个针对JDK 23 的JEP。然而,根据一些 JEP 候选者和草案,特别是那些已经提交的草案,我们可以推测哪些额外的 JEP 有可能包含在 JDK 23 中。
JEP 455,模式中的原始类型、instanceof 和 switch(预览版),已针对 JDK 23。该 JEP 在 Amber 项目的支持下,建议通过在所有模式上下文中允许原始类型模式来增强模式匹配,并扩展**instanceof
并 switch
**适用于所有原始类型。Oracle 技术人员主要成员Aggelos Biboudis最近发布了此功能的更新草案规范。
JEP 468,派生记录创建(预览版),已从其JDK 草案 8321133 升级为候选状态。该 JEP 建议通过记录的派生创建来增强 Java 语言。由于记录是不可变的对象,因此开发人员经常从旧记录创建新记录来对新数据进行建模。派生创建通过从现有记录派生新记录并仅指定不同的组件来简化代码。
JEP 467(Markdown 文档注释)已从JDK草案8316039 提升为候选 状态。此功能建议使用 Markdown 编写 JavaDoc 文档注释,而不是混合使用 HTML 和 JavaDoc标签。这将使文档注释以源代码形式更容易编写和阅读。@
JEP 466,类文件 API(第二个预览版),已从JEP草案8324965 升级为候选 状态。此 JEP 提出第二轮预览,以获得上一轮预览的反馈:JEP 457,类文件 API(预览),将在即将发布的 JDK 22 中提供。此功能提供了用于解析、生成、并转换 Java 类文件。它最初将作为JDK 中ASM(Java 字节码操作和分析框架)的内部替代品,并计划将其作为公共 API 开放。Goetz 将 ASM 描述为"一个带有大量遗留包袱的旧代码库",并提供了有关该草案将如何发展并最终取代 ASM 的背景信息。
JEP 465(字符串模板)已从JEP草案8323333 提升为候选 状态。此 JEP 建议在两轮预览后最终确定此功能,即 JEP 459,字符串模板(第二次预览),将在即将发布的 JDK 22 中提供,以及 JEP 430,字符串模板(预览),将在 JDK 21 中提供。此功能通过字符串模板 (包含嵌入表达式的字符串文字)增强了 Java 编程语言,这些模板在运行时对嵌入表达式进行求值和验证。有关 JEP 430 的更多详细信息可以在 InfoQ新闻报道中找到。
JEP 401,空限制值对象存储(预览版),以前称为原始类(预览版),在 Valhalla 项目的支持下,引入了开发人员声明的原始类 - 由值对象 API 定义的特殊类型的值类 - 即定义新的原始类型。
Oracle 的 Java 架构师Paul Sandoz提交了JEP 草案 8326878 ,Vector API(孵化器)。经过从 JDK 16 到 JDK 22 集成的七轮孵化后,此 JEP 建议在 JDK 23 中重新孵化API,相对于 JDK 22 没有 API 更改,也没有实质性的实现更改。此功能将引入一个 API 来"表达向量计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于同等标量计算的性能。"
Bierman 和PatientEXP 创始人兼首席执行官Archie Cobbs介绍了JEP 草案 8325803 ,Flexible Constructor Bodies (Second Preview),这是一个提出第二轮预览并更改名称 以获取上一轮预览反馈的 JEP,即 JEP 447,Super(...) 之前的语句(预览版),将在即将发布的 JDK 22 中提供。此功能允许不引用正在创建的实例的语句出现在构造函数中的**this()
or调用之前; super()
**并保留构造函数现有的安全性和初始化保证。该 JEP 的变化包括: 对本地类的处理;并将在显式构造函数调用之前不能访问字段的限制放宽为在显式构造函数调用之前不能读取字段的要求。Bierman 提供了此 JEP 的初始规范,供 Java 社区审查并提供反馈。
JEP 草案 8307341 ,准备限制 JNI 的使用,建议限制本质上不安全的 Java 本机接口 (JNI) 的使用以及外部函数和内存 (FFM) API 中受限制方法的使用,该 API 预计将成为JDK 23 中的最后一个功能。从 JDK 23 开始,对齐策略将使 Java 运行时显示有关 JNI 使用的警告,除非 FFM 用户在命令行上启用不安全的本机访问。预计在 JDK 23 之后的版本中,使用 JNI 将抛出异常而不是警告。
JEP 草案 8313278 ,Java 虚拟机的提前编译,建议"增强 Java 虚拟机,使其能够加载编译为本机代码的 Java 应用程序和库,以实现更快的启动和基线执行"。
JEP 草案 8312611 ,计算常量(预览版) ,引入了计算常量 的概念,定义为最多初始化一次的不可变值持有者。这提供了现场的性能和安全优势**final
**,同时在初始化时间方面提供了更大的灵活性。此功能将作为预览API 首次亮相。
JEP 草案 8283227 ,JDK 源结构,一种信息性 JEP 类型,描述了 JDK 源代码以及 JDK 存储库中相关文件的总体布局和结构。该 JEP 建议帮助开发人员适应 JDK 9 中提供的 JEP 201(模块化源代码)中描述的源代码结构。
JEP 草案 8278252 ,JDK 打包和安装指南,一个信息性 JEP,建议为在 macOS、Linux 和 Windows 上创建 JDK 安装程序提供指南,以减少不同 JDK 提供商安装 JDK 时发生冲突的风险。目的是通过规范安装目录名称、包名称和其他可能导致冲突的安装程序元素,在安装 JDK 更新版本时提供更好的体验。
我们预计 Oracle 很快就会开始针对 JDK 23 提供更多 JEP。