📅  最后修改于: 2023-12-03 15:01:33.577000             🧑  作者: Mango
在 Java 有时候我们希望一个类只有有限的几个子类,这个时候可以使用密封类。
密封类是指一个类被sealed
关键字修饰,该类只能由内部定义的几个子类继承。被声明为密封类的类可以在编译时可控地检查到使用它的代码中哪些类可以继承它,并检查其它的子类。这种方式可以更好地保证代码的安全性和正确性。
public sealed class Shape {
...
}
在上述示例中,Shape
被声明为密封类,它只有被内部定义的若干个子类能够继承。
public final class Circle extends Shape {
...
}
在这个示例中,Circle
是Shape
的合法子类,因为它是内部定义的若干个子类之一,而且也符合继承的规则。
密封类应该只在某些情况下使用,例如:
当某个类型只希望有有限的几个子类时。
当希望在继承层级中添加新的子类时,可以获取编译时检查。
在需要使用模式匹配的情况下。
当使用密封类时,编译器会强制规定:
子类必须在密封类的源文件中定义。
子类必须继承它的父类。
子类必须在同一个包中。
子类必须明确指定父类的类型。
下面是一个在实际开发中使用的密封类的示例:
public abstract sealed class Vehicle permits Car, Bus, Truck {
...
}
public final class Car extends Vehicle {
...
}
public final class Bus extends Vehicle {
...
}
public final class Truck extends Vehicle {
...
}
在这个示例中,Vehicle
是一个抽象的密封类,只允许三个子类(Car
,Bus
和Truck
)继承,而且这三个子类均被声明为final
,即不能再被继承。同时,Vehicle
自己也是抽象类,不能被实例化。
在 Java 中,密封类的出现为我们带来了更加规范和安全的编程方式,让我们可以在编译时发现更多的错误,提高代码质量和可维护性。同时,使用密封类还能够提高代码的可扩展性,支持更多的设计模式。因此,对广大 Java 程序员而言,使用密封类是一个必须掌握的技能。