密封类
Java 17 正式引入的语言特性,通过 permits 子句显式限定允许的子类型,使继承关系受控、封闭,从而支持编译期穷尽性检查。
时间轴 (近 90 天)
Java 密封类(Sealed Classes)自 Java 17 正式发布。
密封类通过 permits 子句显式声明允许的子类型,将继承关系从开放变为受控。
结合密封类,编译器能够验证 switch 的所有 permitted 子类是否都被处理,遗漏子类型会导致编译错误(穷尽性检查)。
穷尽性检查只对密封层次有效;对于普通开放接口,编译器仍要求 default 分支。
在 switch 中加入 default 分支会关闭穷尽性检查,导致新增子类型不再触发编译错误;因此使用密封类时应避免不必要的 default。
密封类的子类型可以携带各自不同的状态和方法,表达力比枚举强;如果只是固定的一组常量,枚举是更轻量的选择。
密封类的 permits 子句要求子类必须位于同一模块(或同一包,视模块系统配置而定)。
主流 IDE 已支持对密封层次生成缺失分支的提示,配合编译器的穷尽检查形成双重保障。
据 Hacker News 讨论,不少开发者认为密封类最有价值的场景是领域建模——用一组封闭变体表达业务状态。
全部知识事实 (9)
Java 密封类(Sealed Classes)自 Java 17 正式发布。
50%待验证密封类通过 permits 子句显式声明允许的子类型,将继承关系从开放变为受控。
50%待验证结合密封类,编译器能够验证 switch 的所有 permitted 子类是否都被处理,遗漏子类型会导致编译错误(穷尽性检查)。
50%待验证穷尽性检查只对密封层次有效;对于普通开放接口,编译器仍要求 default 分支。
50%待验证在 switch 中加入 default 分支会关闭穷尽性检查,导致新增子类型不再触发编译错误;因此使用密封类时应避免不必要的 default。
50%待验证密封类的子类型可以携带各自不同的状态和方法,表达力比枚举强;如果只是固定的一组常量,枚举是更轻量的选择。
50%待验证密封类的 permits 子句要求子类必须位于同一模块(或同一包,视模块系统配置而定)。
50%待验证主流 IDE 已支持对密封层次生成缺失分支的提示,配合编译器的穷尽检查形成双重保障。
50%待验证据 Hacker News 讨论,不少开发者认为密封类最有价值的场景是领域建模——用一组封闭变体表达业务状态。
50%