JDK 16
JDK 16 正式发布 Record 和 instanceof 模式匹配,完成 jpackage,并默认加强 JDK 内部 API 封装。
Records(正式)
java
public record User(long id, String name) {
public User {
if (id <= 0) {
throw new IllegalArgumentException("id must be positive");
}
name = name.strip();
}
}Record 隐式继承 java.lang.Record,不能继承其他类,但可以实现接口。它表达的是数据载体语义,不等于深度不可变:组件引用的可变对象仍可被修改。
instanceof 模式匹配(正式)
java
if (value instanceof String text && !text.isBlank()) {
System.out.println(text.length());
}模式变量的作用域由控制流决定,能避免传统强制转换重复。
API 增强
java
List<String> names = stream.toList();Stream.toList() 返回不可修改列表,但不应依赖其具体实现,也不要简单假设它与 Collectors.toList() 的可变性和空值约束相同。
JDK 16 还正式提供 Unix-Domain Socket Channel,适用于同一主机上的高效进程间通信。
jpackage(正式)
jpackage 可以生成 deb、rpm、pkg、dmg、msi、exe 等平台安装包,并可结合 jlink 携带裁剪后的运行时。
JVM 与平台
| 特性 | 说明 |
|---|---|
| Strong Encapsulation by Default | 默认拒绝对大多数 JDK 内部包进行非法反射,可临时用 --illegal-access 放宽 |
| Elastic Metaspace | 更及时地把未使用类元数据内存归还操作系统 |
| ZGC 并发线程栈处理 | 进一步减少 ZGC 安全点工作 |
| Vector API | 第一轮 Incubator,表达可移植 SIMD 计算 |
| Foreign Linker API | Incubator,尝试替代复杂的 JNI 接入方式 |
| Alpine Linux Port | 支持基于 musl libc 的 Alpine Linux |
| Windows/AArch64 Port | 支持 Windows ARM64 |
Sealed Classes(第二次 Preview)
密封类继续预览,并为 JDK 17 正式发布做语义完善。
迁移关注
默认强封装会暴露旧框架和代理库对内部 API 的依赖。临时添加 --add-opens 只能作为迁移过渡,长期方案是升级依赖或改用标准 API。