sealed
sealed 翻译为密封,密封类(Sealed Classes)的首次提出是在 Java15 的 JEP 360 中,并在 Java 16 的 JEP397 再次预览,而在 Java 17 的 JEP 409 成为正式的功能。
Sealed Classes 主要特点是限制继承
Sealed Classes 主要特点是限制继承,Java 中通过继承增强,扩展了类的能力,复用某些功能。当这种能力不受控。与原有类的设计相违背,导致不预见的异常逻辑。
Sealed Classes 限制无限的扩张
Java 中已有 sealed 的设计
- final 关键字,修饰类不能被继承
- private 限制私有类
sealed 作为关键字可在 class 和 interface 上使用,结合 permits 关键字。定义限制继承的密封类。
Sealed Classes
- 声明 sealed Class
public sealed class Shape permits Circle, Square, Rectangle {
private Integer width;
private Integer height;
public void draw(){
System.out.println("=======Shape 图形======");
}
}
permits 表示允许的子类,一个或多个。
2. 声明子类
子类声明有三种
- final 终结,依然是密封的
- sealed 子类是密封类,需要子类实现
- non-sealed 非密封类,扩展使用,不受限
示例:
// 第一种 final :
public final class Circle extends Shape {
}
// 第二种 sealed class :
public sealed class Square extends Shape permits RoundSquare {
@Override
public void draw() {
System.out.println("=======Square 图形======");
}
}
// 密封类的子类的子类:
public final class RoundSquare extends Square {
}
// 非密封类,可以被扩展。放弃密封:
public non-sealed class Rectangle extends Shape {
}
// 继承非密封类:
public class Line extends Rectangle{
}
密封类不支持匿名类与函数式接口。
Sealed Interface
密封接口同密封类。
- 声明密封接口
public sealed interface SomeService permits SomeServiceImpl {
void doThing();
}
- 实现接口
public final class SomeServiceImpl implements SomeService {
@Override
public void doThing() {
}
}
以上类和接口要在同一包可访问范围内。

浙公网安备 33010602011771号