以下是 JDK 23 新增的 12 项功能的摘要和示例。完整背景信息请参考 OpenJDK 网站 上列出的 JEP(Java Enhancement Proposals,JDK 增强建议)。🧐
🧐 什么是 JDK 增强建议(JEP)?
JEP 是 Java 开发的一部分。它定义了功能增强和变更的提案。点击这里查看完整介绍。
目录
- JDK 23 的新功能概述
- JEP 455:模式中的原始类型、
instanceof
和switch
(预览) - JEP 466:Class-File API(二次预览)
- JEP 467:Markdown 格式的文档注释
- JEP 469:Vector API(第八次孵化)
- JEP 473:Stream Gatherers(二次预览)
- JEP 471:弃用
sun.misc.Unsafe
的内存访问方法 - JEP 474:ZGC 默认采用分代模式
- JEP 476:模块导入声明(预览)
- JEP 477:隐式声明类和实例
main
方法(三次预览) - JEP 480:结构化并发(三次预览)
- JEP 481:Scoped 值(三次预览)
- JEP 482:灵活的构造函数体(二次预览)
- JEP 455:模式中的原始类型、
JDK 23 的新功能
JEP 455:模式中的原始类型、instanceof
和 switch
(预览)
此预览功能扩展了模式匹配,允许在所有模式上下文(例如原始类型和引用类型、嵌套或顶层上下文)中使用原始类型的模式,还支持在 instanceof
和 switch
中处理所有原始类型。
示例:
没有原始类型模式时的代码:
switch (x.getStatus()) {
case 0 -> "okay";
case 1 -> "warning";
case 2 -> "error";
default -> "unknown status: " + x.getStatus();
}
启用原始类型模式后:
switch (x.getStatus()) {
case 0 -> "okay";
case 1 -> "warning";
case 2 -> "error";
case int i -> "unknown status: " + i;
}
JEP 466:Class-File API(二次预览)
此 API 提供了标准方法来解析、生成和转换 Java 类文件,取代了 JDK 内部的第三方 ASM 库副本。
JDK 23 的变化:
CodeBuilder
类:精简方法,删除重复或不常用的方法。ClassSignature
类:增强对泛型签名的建模精确度。
JEP 467:Markdown 格式的文档注释
Java 文档注释现在支持 Markdown 语法。相比 HTML,更简洁易读。编译器树 API 也扩展以支持 Markdown 内容。
JEP 469:Vector API(第八次孵化)
Vector API 提供了一种高效表达矢量计算的方式,可在运行时编译为优化的矢量指令。该功能预计能显著提升性能。
示例: 标量计算代码:
void scalarComputation(float[] a, float[] b, float[] c) {
for (int i = 0; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
矢量计算代码:
static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;
void vectorComputation(float[] a, float[] b, float[] c) {
int i = 0;
int upperBound = SPECIES.loopBound(a.length);
for (; i < upperBound; i += SPECIES.length()) {
var va = FloatVector.fromArray(SPECIES, a, i);
var vb = FloatVector.fromArray(SPECIES, b, i);
var vc = va.mul(va).add(vb.mul(vb)).neg();
vc.intoArray(c, i);
}
for (; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
JEP 473:Stream Gatherers(二次预览)
Stream Gatherers 使 Stream API 支持自定义中间操作,扩展了数据流处理的灵活性。
JEP 471:弃用 sun.misc.Unsafe
的内存访问方法
不安全的内存访问方法被标记为弃用,推荐迁移至 VarHandle API 或外部函数和内存 API。
JEP 474:ZGC 默认采用分代模式
分代模式可更频繁地收集年轻对象,提升性能。非分代模式计划在未来版本中移除。
JEP 476:模块导入声明(预览)
该功能允许使用 import module
声明,简化模块化库的重用。
示例:
import module M;
上述声明会导入模块 M 导出的所有公共顶层类和接口。
JEP 477:隐式声明类和实例 main
方法(三次预览)
该功能简化了简单单类程序的编写。
示例: 传统 HelloWorld:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
启用该功能后:
void main() {
System.out.println("Hello, World!");
}
JEP 480:结构化并发(三次预览)
结构化并发旨在简化多线程编程,便于将相关任务视为一个单元进行管理。
示例:
Response handle() throws ExecutionException, InterruptedException {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Supplier<String> user = scope.fork(() -> findUser());
Supplier<Integer> order = scope.fork(() -> fetchOrder());
scope.join().throwIfFailed();
return new Response(user.get(), order.get());
}
}
JEP 481:Scoped 值(三次预览)
Scoped 值允许在线程间共享不可变数据,特别适用于大量虚拟线程的场景。
JEP 482:灵活的构造函数体(二次预览)
该功能允许在调用 super(...)
前初始化字段,提供更灵活的构造函数编写方式。
示例:
public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) {
if (value <= 0) throw new IllegalArgumentException(...);
super(value);
}
}
总结
Java 23 的新功能为开发者带来了更多灵活性与便利。无论是 Stream Gatherers
、结构化并发
,还是 Markdown 文档注释,都提升了代码的简洁性与性能。