用Java密封类打造更坚固的代码契约
在构建面向对象系统时,我们经常需要限制类的继承关系。传统的做法是使用final关键字完全禁止继承,或者通过包级私有构造器控制扩展,但这些方式都显得不够灵活。Java 17正式引入的密封类(Sealed Classes) 终于为我们提供了更优雅的解决方案。
什么是密封类?
密封类允许开发者明确指定哪些类可以继承它,在编译期就建立起清晰的继承层级。这种机制就像是与编译器签订了一份“继承契约”,打破了以往“全开放”或“全封闭”的二元选择。
基本语法:
public sealed class Shape
permits Circle, Rectangle, Triangle {
// 公共代码
}
public final class Circle extends Shape {
/*...*/ }
public final class Rectangle extends Shape {
/*...*/ }
public sealed class Triangle extends Shape permits Equilateral {
/*...*/ }
核心规则:
- 子类必须是
final、sealed或non-sealed - 所有允许的子类必须在同一模块或包中
- 使用
permits关键字明确列出所有合法子类
实际价值:
- 增强代码可读性:继承关系一目了然
- 提升安全性:防止未知子类的引入
- 优化模式匹配:与
switch表达式结合时,编译器能验证完整性
密封类特别适合在定义核心领域模型、API接口或状态机时使用。通过这种精细化的继承控制,我们能够编写出更安全、更易维护的Java代码,让类型系统真正为业务逻辑保驾护航。
拥抱Java的持续演进,善用密封类这类现代特性,能让我们的代码在灵活性与安全性之间找到最佳平衡点。