Java 17 新特性:密封类与密封接口

犬小哈 2024-04-30 约 518 字 大约 2 分钟 共 4 张图 591

友情提示

推荐您使用 Chrome 浏览器来阅读本实战专栏,其他浏览器可能存在兼容性问题。

在 Java 17 中,引入了新特性:密封 ( sealed )类和密封接口。它被用于使用在父类、抽象类和接口中,可以限制哪些子类才能够继承自己

1. 基础用法

接下来,通过一些代码示例,来了解一下 sealed :

public sealed class Base permits B1, B2 {
}

定义一个 class 类,额外添加 sealed 关键字,则表示该类为密封类。并通过 permits 关键字来指定,必须由 B1B2 类才能够继承自己。如果你尝试在其他类中继承 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 {}

最后编辑于 2024-04-30 16:39:41