InfoQ 推荐 ( ) • 2022-09-17 09:43

甲骨文Java平台组首席架构师Mark Reinhold宣布JDK 19(JDK 17之后的第二个非LTS版本)已经进入初始发布候选阶段。主线源代码库(2022年6月初分叉到JDK稳定代码库)定义了JDK 19的特性集。关键的Bug(如回归或严重的功能问题)得到了解决,但必须通过Fix-Request流程批准。根据发布计划,JDK 19将在2022年9月20日正式发布。

最后一组(7个)新特性(以JEP的形式)可以分为三类——核心Java库、Java规范和Hotspot编译器。

被归类为核心Java库的4个新特性是:

JEP 424:外部函数和内存API(预览)";JEP 425:虚拟线程(预览)";JEP 426:Vector API(第四轮孵化器)";JEP 428:结构化并发(孵化器)"。

被归类为Java规范的2个新特性是:

JEP 405:记录模式(预览)";JEP 427:switch的模式匹配(第三次预览)"。

最后,被归类到Hotspot编译器的一个新特性是:

JEP 422:Linux/RISC-V移植"

我们将介绍这些新特性,以及涵盖了这些新特性的四个主要Java项目——Amber"、Loom"、Panama"和Valhalla"。这些项目旨在孵化出一系列组件,并最终经过合并包含在JDK中。

Amber

JEP 405,即记录模式(预览),提议用记录模式来解构记录值。记录模式可以与类型模式一起使用,“支持强大的、声明式的和可组合的数据浏览和处理形式”。类型模式最近已通过JEP 406(即switch的模式匹配(预览),在JDK 17中交付)和JEP 420(即switch的模式匹配(第二次预览),在JDK 18中交付)被用在switch的case子句中。更多关于JEP 405的细节可以在InfoQ的报道"中看到。

JEP 427,即switch的模式匹配(第三次预览),针对前两轮预览反馈进行了增强——JEP 406(即switch的模式匹配(预览),在JDK 17中交付)和JEP 420(即switch的模式匹配(第二次预览),在JDK 18中交付)。JEP 420以来的变更包括——保护模式被替换为switch块中的when子句;当选择器表达式的值为空时,模式switch的运行时语义与遗留switch的语义更为接近。

Loom

JEP 425,即虚拟线程(预览),向Java平台引入了虚拟线程。这是一种轻量级线程,极大地减少了编写、维护和观察高吞吐量并发应用程序的工作量。更多关于JEP 425的细节可以在InfoQ的报道和甲骨文Java平台组开发者布道师José Paumard的JEP Café屏播中找到。

JEP 428,即结构化并发(孵化器),提议通过引入一个新的库来简化多线程编程,这个库将运行在不同线程中的多个任务视为单个工作单元。这可以简化错误处理和取消操作,提高可靠性,并增强可观察性。更多关于JEP 428的细节可以在InfoQ的报道"中看到。

Panama

JEP 424,即外部函数和内存API(预览),为Java应用程序引入一个API,通过高效调用外部函数和安全访问不受JVM管理的外部内存来实现与Java运行时之外的代码和数据的互操作。这个JEP演化自JEP 419(即外部函数和内存API(第二轮孵化器),在JDK 18中交付)和JEP 412(即外部函数和内存API(孵化器),在JDK 17中交付),并针对Java社区的反馈进行了增强。

JEP 426,即Vector API(第四轮孵化器),根据前三轮孵化的反馈进行了改进——JEP 417(即Vector API(第三轮孵化器),在JDK 18中交付)、JEP 414(即Vector API(第二轮孵化器),在JDK 17中交付),以及JEP 338(即Vector API(孵化器),在JDK 16中作为孵化器模块交付)。JEP 426提议对Vector API进行增强,从MemorySegment(JEP 424,即外部函数和内存API(预览))加载或存储Vector。

Hotspot编译器

JEP 422,即Linux/RISC-V移植,提议将JDK移植到Linux/RISC-V(一种免费、开源的RISC指令集架构)上。移植版本将支持模板解释器、C1和C2 JIT编译器以及所有当前的主要垃圾回收器,包括ZGC和Shenandoah。这个JEP的主要重点是将移植的内容集成到JDK主线代码库中。

JDK 20

JDK 20预计于2023年3月发布GA版本,目前还没有相关的JEP。但是,根据最近提交的JEP草案和后续JEP,我们可以推测哪些JEP有可能被包含在JDK 20中。

JEP 429,即扩展本地变量(孵化器)",提议在线程内部和线程之间共享不可变数据。这要优于线程局部变量,特别是在使用大量虚拟线程时。更多关于JEP 429的细节可以在InfoQ的报道"中看到。

JEP草案8277163,即值对象(预览)",提议创建值对象——指定实例行为的无标识值类。这个草案与JEP 401(原语类(预览),仍处于候选状态)相关。

JEP 401,即原语类(预览)",引入了由开发者声明的原语类——在前面提到的值对象(预览)JEP草案中定义的特殊类型的值类——定义了新的原语类型。

JEP草案8273943,即字符串模板(预览)",提议使用字符串模板来增强Java语言。字符串模板类似于字符串字面量,但包含了嵌入表达式,在运行时将合并到字符串模板中。

JEP草案8280836,即有序集合",提议引入“一组新的接口来表示集合概念,这些集合中的元素按照定义良好的顺序进行排列,作为集合的结构属性。”这是由于Java的Collections Framework缺乏定义良好的顺序和统一操作。

JEP草案8284289,即改进的异步获取调用跟踪的方法",提议定义一个有效的API,用于从信号处理器中获取用于分析的异步调用跟踪信息。

JEP草案8283227,即JDK源结构",用于描述JDK源代码和JDK代码库中相关文件的总体布局和结构。这个JEP建议帮助开发者适应JEP 201(在JDK 9中交付的模块化源代码)所描述的源代码结构。

JEP草案8280389,即ClassFile API",提议提供一个用于解析、生成和转换Java类文件的API。这个JEP在一开始将作为JDK内部的ASM(Java字节码操作和分析框架)替代品,并计划将其作为公共API开放出来。甲骨文Java语言架构师Brian Goetz将ASM描述为“一个带有大量遗留包袱的旧代码库”,并讲解了这个草案将如何演变并最终取代ASM。

JEP草案8278252,即JDK打包和安装指南",提议为macOS、Linux和Windows平台提供创建JDK安装程序的指南,以降低不同JDK提供程序安装JDK时发生冲突的风险。其目的是通过规范化安装目录名称、包名和其他可能导致冲突的安装程序元素,在安装JDK更新版本时提供更好的用户体验。

我们预计甲骨文将很快开始将这些JEP中的一些或其他JEP包含在JDK 20中。

原文链接:

JDK 19 and JDK 20: What We Know So Far"

相关阅读:

Java 近期新闻:JDK 19 进入 RDP2、Oracle 关键补丁更新、TornadoVM on M1、Grails CVE"