JDK23:Java23的新特性预览

程序员咋不秃头 2024-08-17 03:05:54

Java 开发工具包 (JDK) 23 是标准Java的下一个版本,现在已经进入候选发布的阶段了。

JDK 23 的正式发布日期定于 9 月 17 日。

JDK 23 的功能集合已最终确定为十几个功能。以前在JDK 22和JDK 21中预览过的字符串模板的第三个预览版已从 JDK 23 中删除。

JDK 23将包括范围值、结构化并发和隐式声明的类和实例方法的第三个预览,以及灵活构造函数主体、流收集器和类文件 API 的第二个预览版本。

JDK 23 将包括模块导入声明、Markdown 文档注释、矢量 API 的第八个孵化功能,以及模式、instanceof和switch预览版本。并且该版本将弃用sun.misc.UnSafe 中的内存访问方法,将z垃圾收集器的代理模式设为默认模式。

值得的一提的是,JDK 23 是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持,而JDK 21则是一个提供很多年支持的 LTS 版本。

开发者也可以从jdk.java.net访问 JDK 23 的早期版本。

范围值

范围值,之前在 JDK 22 和 JDK 21 中预览过,其允许方法与线程内的调用者以及子线程共享不可变数据。

提案指出,范围值比线程本地值更容易推理,并且具有更低的空间和时间成本,特别是与虚拟线程和结构化并发一起使用时。JDK 23 中范围值的预览与以前的预览相比引入了一项更改:方法上的操作参数的类型ScopedValue.callWhere是一个新的函数接口,允许 Java 编译器推断是否可能抛出已检查异常。经过此更改,该ScopeValue.getWhere方法不再需要并已经被删除。

弃用内存访问方法

JDK 23 的计划还要求弃用中的内存访问方法,sun.misc.Unsafe将在未来的版本中删除。这些方法不再受支持,已被标准 API 取代,即VarHandle API和外部函数和内存 API。鼓励库开发人员从 sun.misc.Unsafe 迁移到受支持的替代品,以便应用程序可以顺利迁移到现代 JDK 版本。

该提案的目标包括为在未来的 JDK 版本中删除sun.misc.Unsafe 内存访问方法做好生态系统的准备,并帮助开发人员意识到他们的应用程序何时直接或间接依赖这些内存访问方法。

完全删除sun.misc.Unsafe并不是目标,因为其中的少数方法不用于内存访问,之后将被弃用并单独删除。

结构化并发

结构化并发将在 JDK 23 中获得第三次预览,此前在 JDK 22 和 JDK 21 中已经进行了预览。

其目的是通过引入结构化并发 API 来简化并发编程,该 API 将不同线程中的相关任务组视为单个工作单元,简化错误处理和取消以提高可靠性和可观察性。该提案的目标包括推广一种编程风格,可以消除因取消和关闭而产生的常见风险(例如线程泄漏和取消延迟),并提高并发代码的可观察性。

灵活的构造函数体

灵活的构造函数体将在 JDK 23 中获得第二次预览。

该功能在 JDK 22 中以 statements before 的 super(…)名称进行了预览。

此提案将允许构造函数体在显式调用构造函数之前初始化同一类中的字段。它目标让开发人员更自由地表达构造函数的行为,从而更自然地放置当前必须考虑到辅助的静态方法、辅助中间构造函数或构造函数参数中的逻辑。

该功能还旨在保证构造函数在类实例化期间按自上而下的顺序运行,确保子类构造函数中的代码不会干扰超类实例化。

隐式声明的类和实例方法

隐式声明的类和实例方法之前已在JDK 21和JDK 22中预览过, 它正在改进 Java 语言,使初学者无需了解为大型程序设计的语言功能即可快速编写自己的第一批程序。

初学者可以为单类程序编写精简的声明,然后随着技能的增长无缝扩展程序以使用更高级的功能。JDK 23 中添加了两项增强功能:隐式声明的类将自动导入三种方法,用于使用控制台进行简单的文本 I/O,并将按需导入staticjava.base模块导出的包,以及所有公共顶级类与接口。

模块导入声明

模块导入声明是 JDK 23 中的一项预览功能,它增强了 Java 的功能,使其能够简洁地导入模块导出的所有软件包。该提案于 8 月提出,简化了模块库的重用,但不要求导入的代码位于模块本身中。

其目标包括通过允许一次导入整个模块来简化模块库的使用,并避免在使用模块导出的 API 的不同部分时产生多个类型导入声明的噪音。

另一个目标是让初学者更轻松地使用第三方库和基本 Java 类,而无需了解它们在包层次结构中的位置。

Markdown 文档注释

Markdown 文档注释是去年 9 月提出的一项提案,该提案允许使用 Markdown 编写 JavaDoc 文档注释,而不是仅使用 HTML 和 JavaDoc @tags 的混合形式。该提案旨在通过引入使用 Markdown 语法以及 HTML 元素和 JavaDoc 标签的功能,使 API 文档注释更易于以源形式编写和阅读。

它还旨在扩展Compiler Tree API,以使其他分析文档注释的工具能够处理 Markdown 内容。

该计划不应对现有文档注释的解释产生不利影响。

垃圾收集器 (ZGC) 切换为分代模式

JDK 23 还计划将Z 垃圾收集器 (ZGC) 的默认模式切换为分代模式。

分代 ZGC旨在通过更频繁地收集年轻对象(这些对象往往在年轻时“死亡”)来提高 Java 应用程序的性能。非分代模式将被弃用,并打算在未来的版本中删除。此功能的目标包括表明未来开发将专注于分代 ZGC 的意图,并降低支持两种不同模式的维护成本。维护非分代 ZGC 会减慢新功能的开发速度。

ZGC 于 2020 年 9 月在JDK 15中添加到 Java 中。

矢量API

矢量API已在从JDK 16到上个月的JDK 22的 Java 早期版本中孵化,它引入了一种 API 来表达矢量计算,这些计算可在运行时可靠地编译为受支持的 CPU 架构上的最佳矢量指令。

该提案的目标包括提供清晰简洁的 API、在 x64 和 AArch64 架构上提供可靠的运行时编译和性能、提供优雅降级、与平台无关以及与Valhalla 项目保持一致,后者旨在通过值对象增强 Java 对象模型。

流收集器

流收集器(之前在 JDK 22 中预览过)将增强流 API以支持自定义中间操作。流收集器将允许流管道以现有内置中间操作无法轻易实现的方式转换数据。

目标包括使流管道更加灵活和富有表现力,并允许自定义中间操作操纵无限大小的流。

类文件 API

类文件 API旨在提供处理类文件的 API,该 API 遵循Java 虚拟机规范定义的类文件格式。它还将使 JDK 组件能够迁移到标准 API,并最终删除 JDK 内部的第三方ASM 库副本。

类文件 API 将添加改进功能,包括精简类CodeBuilder,该类具有用于字节码指令的工厂方法,包括低级工厂、中级工厂和基本块的高级构建器。

对于 JDK 23,Java 的构建者删除了与低级方法重复或不常用的中级方法,同时重命名了剩余的中级方法以提高可用性。他们还改进了类ClassSignature模型,该模型已得到改进,可以更准确地模拟超类和超接口的通用签名。

根据此功能背后的 OpenJDK 提案,Java 平台应定义和实现一个标准的类文件 API,该 API 与类文件格式一起发展,该格式每六个月可以开发一次。

原始类型、instanceof和switch

另一个预览特性也被提及将包含在JDK 23中,即模式中的原始类型、instanceof和switch。

该特性将通过允许在所有模式上下文中使用原始类型模式来增强模式匹配,并扩展instanceof和switch以与所有原始类型一起使用。

其目标包括提供易于使用的构造块,以消除由于不安全的强制类型转换而丢失信息的风险;将模式类型与instanceof对齐;instanceof与安全强制类型对齐;通过允许所有类型(无论是原始类型还是引用类型)的类型模式来允许统一的数据探索;允许模式匹配在嵌套和顶级上下文中使用所有原始类型模式。

同时遵循Java 5 switch(enum switch)和 Java 7(string switch)中的增强功能来处理任何原始类型的值。

字符串模板

字符串模板在 JDK 22 和 JDK 21 中均有预览,但在 JDK 23 中将被删除。该功能旨在通过结合文字文本和嵌入式表达式来补充 Java 的字符串文字和文本块,以产生专门的结果。

OpenJDK 社区认为该功能“没有发挥应有的作用”,进一步的评估和可能的重新设计尚需要一些时间等待。

结语

Java 的大管家 Oracle 还透露了 2024 下半年的 Java 开发计划。

Oracle 提到将涉及 OpenJDK 项目的改进,包括用于开发较小、面向生产力的Amber功能、用于将 Java 扩展到 GPU 等外部编程模型的Babylon ,以及用于使用值对象增强 Java 对象模型,以消除长期存在的性能瓶颈的 Valhalla等。

0 阅读:15