JDK 20 - Java 细品

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().
  • ExecutorServiceAutocloseable.

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 更改

  • MemorySegmentMemoryAddress 抽象已统一。
  • sealed MemoryLayout 层次结构已增强,以方便与 switch 中的模式匹配一起使用。
  • MemorySession 已拆分为 ArenaSegmentScope

JEP 438 向量 API(第五次孵化器)

JEP 438,向量 API 的第五次孵化器,是在 JDK 20 发布过程的后期添加的。这是由于沟通不畅造成的,因为 JDK 20 中没有对向量 API 进行任何 API 更改;但是,处于孵化器状态的功能仍然需要在它们包含的每个版本中使用 JEP,而处于孵化器状态。JEP 438 阐明了向量 API 将保持孵化器状态,直到 Valhalla 项目(特别是值类)的功能交付。

其他资源

编码愉快!