解锁Java 17新利器:密封类(Sealed Classes)的精准控制
在面向对象设计中,安全地限制类的继承层次一直是个挑战。传统final
和包级私有访问控制往往过于生硬。Java 17正式推出的密封类(Sealed Classes) 为此提供了优雅的解决方案,让开发者能精确掌控哪些类可以继承或实现目标类型。
核心机制
通过sealed
关键字声明父类,并用permits
子句明确指定允许扩展它的直接子类:
public sealed abstract class Shape
permits Circle, Rectangle, Triangle {
// 仅允许这三个子类
}
子类则必须为final
、sealed
或non-sealed
之一,彻底关闭或延续继承控制:
public final class Circle extends Shape {
... } // 终止扩展
public non-sealed class Rectangle extends Shape {
... } // 开放扩展
public sealed class Triangle extends Shape permits EquilateralTriangle {
... }
模块化协作
在模块化项目中,需在module-info.java
中开放密封包权限,确保跨模块访问合法:
module com.example.geometry {
exports com.example.geometry to com.example.app; // 关键授权
}
设计价值
- 领域建模更安全:精确表达如“形状只有圆、矩形、三角”等业务约束。
- 模式匹配更健壮:结合
instanceof
模式匹配时,编译器可验证是否覆盖所有许可子类。 - 代码可维护性提升:避免意外继承导致的架构腐化。
关键提示:密封类需与子类位于同一模块(或明确授权的模块),未声明子类将导致编译错误。
密封类是Java向更严谨类型系统迈进的重要里程碑。它填补了访问控制的空白,让领域模型的表达力与安全性达到新高度。随着模式匹配等特性完善,密封类将成为构建健壮Java应用的核心工具之一。