JDK 20 发布! - Sip of Java
Billy Korando 于 2023 年 4 月 22 日
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 项目引入的最初三大主要变化中的最后一个,另外两个是虚拟线程和结构化并发。范围值提供了一种不可变的方式来在虚拟线程内部和之间共享数据。范围值旨在改进线程本地的一些缺点,这些缺点在虚拟线程的上下文中尤其明显,在虚拟线程中可能存在数千个线程。请查看附加阅读部分以获取指向 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 项目的功能(特别是值类)交付。
附加阅读
Java 20 - 从 ThreadLocal 到 ScopedValue 与 Loom 的完整教程 - https://www.youtube.com/watch?v=fjvGzBFmyhM
祝您编码愉快!