Java 23 的新功能

以下是 JDK 23 新增的 12 项功能的摘要和示例。完整背景信息请参考 OpenJDK 网站 上列出的 JEP(Java Enhancement Proposals,JDK 增强建议)。🧐 


🧐 什么是 JDK 增强建议(JEP)?

JEP 是 Java 开发的一部分。它定义了功能增强和变更的提案。点击这里查看完整介绍。


目录

  • JDK 23 的新功能概述
    • JEP 455:模式中的原始类型、instanceofswitch(预览)
    • 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:灵活的构造函数体(二次预览)

JDK 23 的新功能

JEP 455:模式中的原始类型、instanceofswitch(预览)

此预览功能扩展了模式匹配,允许在所有模式上下文(例如原始类型和引用类型、嵌套或顶层上下文)中使用原始类型的模式,还支持在 instanceofswitch 中处理所有原始类型。

示例:

没有原始类型模式时的代码:

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 文档注释,都提升了代码的简洁性与性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小DuDu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值