代码对比
✕ Java 8
// Anyone can extend Shape
public abstract class Shape { }
public class Circle extends Shape { }
public class Rect extends Shape { }
// unknown subclasses possible
✓ Java 17+
public sealed interface Shape
permits Circle, Rect {}
public record Circle(double r)
implements Shape {}
public record Rect(double w, double h)
implements Shape {}
发现此代码有问题? 告诉我们。
为什么现代方式更好
受控层次
只有允许的子类型可以扩展——没有意外子类。
穷举匹配
编译器验证 switch 覆盖所有情况,无需 default。
代数数据类型
自然建模求和类型——密封类 + record = Java 中的 ADT。
旧方式
开放层次
现代方式
sealed permits
自 JDK
17
难度
中级
JDK 支持
用密封类定义类型层次
可用
自 JDK 17 LTS 起广泛可用(2021 年 9 月)
工作原理
密封类定义了一组封闭的子类型。编译器在编译时知道所有可能的子类型,从而支持穷举 switch 表达式。
相关文档