java 17 - 密封类 sealed class
sealed关键字通常用于编程语言中的类、接口,其作用是限制这些类、接口的继承、实现或重写范围。它可以确保在同一个编译单元内所有相关的类都能被看到,并且不会被外部代码所继承、实现或重写。密封类或许对于框架或中间件的开发者更有用,它能够更加细粒度的控制继承结构。sealed具有以下特性:
- 子类范围限定:密封类通过
permits关键字指定允许继承它的具体子类。只有这些指定的子类可以继承密封类,其他类则不能。 - 细化类型检查:使用密封类可以帮助编译器进行更细致的类型检查,因为在编译期间可以明确知道哪些类是密封类的子类,从而提供更严格的类型安全性。
- 支持模式匹配:Java 17 引入了模式匹配的增强功能,密封类与模式匹配结合可以更方便地进行类型判断和分支处理,提高代码的可读性和易维护性。
# 示例
要使用 sealed 关键字,可以按照以下的语法格式:
// 类
public sealed class Shape permits Circle, Square, Triangle {
// class definition
}
// 接口
public sealed interface Service permits AServiceImpl, BServiceImpl {
// interface definition
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
使用 permits 关键字列出了允许继承 Shape 的类,即 Circle、Square 和 Triangle。这意味着只有这些列出的类才能继承 Shape,其他类则不能。
permits关键字声明的类必须是直接子类- 密封类不支持匿名类和函数式接口
对于继承自密封类的子类,必须是final、non-sealed、sealed的一种,例如:
public final class Circle extends Shape {
// class definition
}
1
2
3
2
3
在 Java 中,如果一个子类继承自密封类并且被标记为终态 final,那么它具有以下特性:
- 不可再被继承:被标记为
final的类表示它是最终的,不能被其他类所继承。这意味着该类的继承结构已经到达了终点,不能再派生出新的子类。 - 提高安全性:将子类标记为
final可以提高程序的安全性,因为它确保了这个子类不会有任何派生类来改变其行为或添加新的属性。 - 显式表达设计意图:通过将类标记为
final,开发者可以明确地表达出他们的设计意图,即不希望该类被继承,从而使代码更易于理解和维护。
public non-sealed class CustomPolygon extends Shape {
// class definition
}
1
2
3
2
3
如果一个类继承自密封类并且被标记为 non-sealed,则该子类具有以下特性:
- 允许进一步继承:将子类标记为
non-sealed表示允许其他类继承它。这意味着该子类的下一级子类可以是任何类,不受继承约束。 - 灵活性增加:
non-sealed子类的出现使得继承体系更加灵活,允许在下一级子类中定义新的类来扩展功能或引入新行为。 - 可以被实例化:与
sealed类及其permitted子类不同,non-sealed子类可以被直接实例化,而不需要专门的工厂方法或构造器。 - 适用于桥接模式等场景:在某些设计模式或需求下,可能需要允许进一步继承,这时使用
non-sealed类可以很好地满足这种需求,例如桥接模式中的抽象部分。
上次更新: 2024/01/11 17:06:16