Java 25 LTS 核心特性详解
关键变化在于:IO 类位于 java.lang 包中,被所有源文件隐式导入;但 IO 的静态方法不再被隐式导入,调用时需写出类名(如 IO.println)。其底层实现基于 System.out 与 System.in,而非早期的 Console 类。
2. 灵活构造函数体(正式转正)
过去,构造函数中的 super(...) 或 this(...) 必须置于首行。Java 25 允许在这些显式调用之前放置不引用正在构造实例的语句,主要用于参数校验与字段初始化。
class User { private final String name; User(String name) { if (name == null) throw new IllegalArgumentException(); this.name = name.trim(); } }
这一改动使得类在方法被重写时更具可靠性,因为字段初始化可以在委托给其他构造函数之前完成。
3. 模块导入声明(正式转正)
允许通过一条语句导入模块导出的所有包,简化了模块化库的使用,且不要求调用方代码本身位于模块中。
import module java.base;
4. 模式匹配支持原始类型(第三次预览)
instanceof 与 switch 的模式匹配范围扩展至所有原始类型,消除了此前在类型收窄时的潜在精度损失问题。该特性仍处于预览阶段,需启用预览标志。
二、并发编程:结构化与作用域化
1. 作用域值(正式转正)
ScopedValue 提供了一种比 ThreadLocal 更安全、开销更低的不可变数据共享方式。它特别适合与虚拟线程及结构化并发配合使用,避免了线程局部变量在大量虚拟线程场景下的内存与时间成本。
final static ScopedValue<String> USER = ScopedValue.newInstance(); void handle() { ScopedValue.where(USER, "alice").run(() -> { process(); // 在此调用链中可读取 USER }); }
2. 结构化并发(第五次预览)
将一组在不同线程中执行的相关任务视为一个工作单元,统一处理错误传播与取消操作。经过多轮迭代,API 已趋于稳定,但仍需预览标志启用。
三、性能与运行时改进
1. 紧凑对象头(Compact Object Headers)
在 64 位平台上将对象头从 128 位压缩至 64 位,直接减少堆内存占用,提升缓存局部性。该特性在 Java 25 中正式产品化,对内存敏感型应用收益明显。
2. AOT 命令行易用性与方法剖析
Project Leyden 的持续产出:Ahead-of-Time Command-Line Ergonomics 与 Ahead-of-Time Method Profiling 简化了 AOT 缓存的生成流程,有助于改善 Java 应用的启动时间与达到峰值性能的速度。
3. JFR 增强
新增 CPU 时间剖析(实验性)、协作采样以及方法计时与追踪事件,使 Flight Recorder 在性能诊断上的粒度更细、侵入性更低。
四、安全与密码学
1. 密钥派生函数 API(正式转正)
提供标准的 KDF(Key Derivation Function)API,用于从秘密密钥与其他数据派生出额外密钥。这是迈向混合公钥加密(HPKE)支持的重要一步,也有助于抵御“先收集、后解密”的量子攻击威胁。
2. PEM 编码(预览)
新增 API 用于在 PEM 文本格式与密码学对象(密钥、证书、CRL)之间进行编解码,填补了 Java 标准库在这一常用格式上的空白。
五、移除与弃用
Java 25 移除了 32 位 x86 端口,并继续推进永久禁用 Security Manager 的进程。此外,对 sun.misc.Unsafe 内存访问方法的警告机制也在持续收紧。
- 点赞
- 收藏
- 关注作者
评论(0)