Java 密封类:精细化控制继承关系
引言
Java 17 正式引入了 密封类(Sealed Classes),解决了长期存在的继承滥用问题。通过它,开发者可以明确定义哪些类可以继承或实现当前类/接口,大幅提升代码的安全性和可维护性。
核心语法
定义一个密封类只需两步:
- 使用
sealed关键字修饰类/接口; - 通过
permits指定允许继承的子类。
public sealed abstract class Vehicle permits Car, Truck {
// 父类逻辑
}
public final class Car extends Vehicle {
/* 必须为 final/sealed/non-sealed */ }
public non-sealed class Truck extends Vehicle {
/* 允许继续扩展 */ }
关键规则
- 子类限制:
permits列表外的类无法继承。 - 子类修饰符:子类必须为以下之一:
final:禁止进一步继承;sealed:延续密封规则;non-sealed:开放继承(传统模式)。
实际价值
- 增强安全性:防止未知子类破坏业务逻辑(如支付模块的支付方式扩展);
- 清晰建模:明确表达领域模型中有限的类型(如“几何图形”只允许圆、矩形);
- 模式匹配优化:结合
switch模式匹配时,编译器可检测是否覆盖所有子类。
示例场景:支付网关
public sealed interface PaymentMethod permits CreditCard, PayPal {
void pay();
}
public final class CreditCard implements PaymentMethod {
... }
public final class PayPal implements PaymentMethod {
... }
// 其他类无法实现 PaymentMethod!
总结
密封类是 Java 对“可控扩展性”的重要实践,尤其适用于需要严格边界定义的模块(如API、核心领域层)。它通过编译时约束,减少了运行时错误,使代码更健壮。建议在涉及敏感继承关系的场景中优先采用。