JDK 20 - Java 细品
Billy Korando 于 2023 年 4 月 1 日
JDK 20 已于 3 月 21 日发布!这是自 2018 年 3 月 JDK 10 开始的六个月发布周期中发布的第 11 个 JDK 版本。JDK 20 包含七个新的 JEP(JDK 增强提案),全部处于孵化器或预览状态。让我们回顾一下这些 JEP 以及它们对 Java 未来意味着什么!
Loom 项目
Loom 项目在 JDK 20 中包含三个 JEP;
JEP 429 范围值(孵化器)
JEP 429,范围值,是 JDK 20 中引入的最重大变化。范围值代表了 Loom 项目引入的最初三大主要变化中的最后一种,另外两种是虚拟线程和结构化并发。范围值提供了一种不可变的方式来在虚拟线程内部和之间共享数据。范围值旨在改进 Thread Local 的一些缺点,这在虚拟线程的上下文中尤其明显,因为可能存在数千个线程。查看附加阅读部分以获取指向 José Paumard 关于范围值的视频的链接,以更深入地了解此功能。
JEP 436 虚拟线程(第二次预览)
虚拟线程在 JEP 436 中进入第二次预览。JEP 436 中没有引入新的 API 更改,并且 JDK 19 中引入的几个 API 已最终确定,因为它们在虚拟线程的上下文中很有用。已最终确定的 API 是
Thread.join(Duration)
,sleep(Duration)
,threadId()
.Future.resultNow()
,exceptionNow()
,state()
.ExecutorService
是Autocloseable
.
JEP 437 结构化并发(第二次孵化器)
结构化并发在 JDK 20 中与 JEP 436 进入第二次孵化器。JEP 437 中没有新的 API 更改;唯一的更改是 StructuredTaskScope
已更新以支持范围值的继承。
Amber 项目
Amber 项目在 JDK 20 中包含两个 JEP;
JEP 432 记录模式(第二次预览)
记录模式在 JEP 432 中进入第二次预览,并包含三个关键更改。
- 添加了对泛型记录模式的类型推断的支持
interface Name<T> {}
record FullName<T>(T firstName, T lastName) implements Name<String> {};
public static void main(String... args){
FullName <String> name = new FullName<>("William", "Korando");
printName(name);
}
public static void printName(Name name) {
if(name instanceof FullName(var first, var last))
System.out.println(last + ", " + first);
}
- 添加了对增强
for
循环头中记录模式的支持
record Point(int x, int y) {}
static void dump(Point[] pointArray) {
for (Point(var x, var y) : pointArray) {
System.out.println("(" + x + ", " + y + ")");
}
}
- 删除了对命名记录模式的支持
Object object = new Point(1, 2);
if (object instanceof Point(int i, int j) p) {
System.out.println("object is a Point, p.i = "
+ p.i() + ", p.j = " + p.j()
+ ", i = " + i + ", j = " + j);
}
JEP 433 用于 Switch 的模式匹配(第四次预览)
用于 Switch 的模式匹配在 JEP 433 中进入第四次,也是最后一次预览状态。本轮预览包含三个更改
- 详尽的
switch
将抛出MatchException
而不是IncompatibleClassChangeError
。 - 简化了
switch
标签。 - 支持在
switch
标签中对记录模式的类型推断。
巴拿马项目
巴拿马项目在 JDK 20 中包含两个 JEP;
JEP 434 外部函数和内存 API(第二次孵化器)
JEP 434 定义了外部函数和内存 API 的第二次孵化器。此 JEP 包含三个 API 更改
MemorySegment
和MemoryAddress
抽象已统一。sealed MemoryLayout
层次结构已增强,以方便与switch
中的模式匹配一起使用。MemorySession
已拆分为Arena
和SegmentScope
。
JEP 438 向量 API(第五次孵化器)
JEP 438,向量 API 的第五次孵化器,是在 JDK 20 发布过程的后期添加的。这是由于沟通不畅造成的,因为 JDK 20 中没有对向量 API 进行任何 API 更改;但是,处于孵化器状态的功能仍然需要在它们包含的每个版本中使用 JEP,而处于孵化器状态。JEP 438 阐明了向量 API 将保持孵化器状态,直到 Valhalla 项目(特别是值类)的功能交付。
其他资源
编码愉快!