- By test - In 中国vs巴西世界杯
Java 密封类:精细化控制继承关系
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、核心领域层)。它通过编译时约束,减少了运行时错误,使代码更健壮。建议在涉及敏感继承关系的场景中优先采用。

