JDK 20 发布! - Sip of 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 项目引入的最初三大主要变化中的最后一个,另外两个是虚拟线程和结构化并发。范围值提供了一种不可变的方式来在虚拟线程内部和之间共享数据。范围值旨在改进线程本地的一些缺点,这些缺点在虚拟线程的上下文中尤其明显,在虚拟线程中可能存在数千个线程。请查看附加阅读部分以获取指向 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 项目的功能(特别是值类)交付。

附加阅读

Java 20 - 从 ThreadLocal 到 ScopedValue 与 Loom 的完整教程 - https://www.youtube.com/watch?v=fjvGzBFmyhM

祝您编码愉快!