Java 17 新特性:密封类与密封接口
友情提示
推荐您使用 Chrome 浏览器来阅读本实战专栏,其他浏览器可能存在兼容性问题。
在 Java 17 中,引入了新特性:密封 ( sealed )类和密封接口。它被用于使用在父类、抽象类和接口中,可以限制哪些子类才能够继承自己。
1. 基础用法
接下来,通过一些代码示例,来了解一下 sealed
:
public sealed class Base permits B1, B2 {
}
定义一个
class
类,额外添加sealed
关键字,则表示该类为密封类。并通过permits
关键字来指定,必须由B1
、B2
类才能够继承自己。如果你尝试在其他类中继承Base
, 对不起,报错伺候!
public final class B1 extends Base {
}
public final class B2 extends Base {
}
2. 密封接口与抽象类
另外,在接口和抽象类中,也可以使用 sealed
密封特性。以下是接口中的使用示例:
public sealed interface BaseInterface permits BImpl1, BImpl2 {
}
public final class BImpl1 implements BaseInterface {
}
public final class BImpl2 implements BaseInterface {
}
以下是抽象类中的使用示例:
public sealed abstract class BaseAbstract permits A {
}
public final class A extends BaseAbstract {
}
3. 子类修饰符限制
你应该也注意到了,以上示例中的子类,我们都添加了
final
关键字。那是因为,sealed
类的子类只能通过下面的某个修饰符来定义,这是强制规定!
final
: 不允许再定义子类;sealed
: 允许有一组密封子类;non-sealed
: 新关键字,允许未知的子类继承它,即不用通过permits
指定谁来继承;
以下是子类使用到 sealed
的使用示例:
sealed class Base permits B {}
sealed class B extends Base permits C {}
sealed class C extends B permits D {}
final class D extends C {}
注意:一个
sealed
类必须至少有一个子类。
最后,再列举一个子类为 non-sealed
的示例:
sealed class Base permits B {}
non-sealed class B extends Base {}
final class C extends B {}