Skip to content

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 可以生成 debrpmpkgdmgmsiexe 等平台安装包,并可结合 jlink 携带裁剪后的运行时。

JVM 与平台

特性说明
Strong Encapsulation by Default默认拒绝对大多数 JDK 内部包进行非法反射,可临时用 --illegal-access 放宽
Elastic Metaspace更及时地把未使用类元数据内存归还操作系统
ZGC 并发线程栈处理进一步减少 ZGC 安全点工作
Vector API第一轮 Incubator,表达可移植 SIMD 计算
Foreign Linker APIIncubator,尝试替代复杂的 JNI 接入方式
Alpine Linux Port支持基于 musl libc 的 Alpine Linux
Windows/AArch64 Port支持 Windows ARM64

Sealed Classes(第二次 Preview)

密封类继续预览,并为 JDK 17 正式发布做语义完善。

迁移关注

默认强封装会暴露旧框架和代理库对内部 API 的依赖。临时添加 --add-opens 只能作为迁移过渡,长期方案是升级依赖或改用标准 API。