Sealed Classes 是 JDK 17 中引入的一项新特性,它可以限制一个类或接口的子类和实现类的数量,并强制编译时检查所有的子类和实现类,从而增强了类型安全和代码可维护性。
Sealed Classes 代码示例:
public sealed class Shape permits Circle, Rectangle, Square {
// 抽象方法
public abstract double area();
// 非抽象方法
public void printArea() {
System.out.println("面积为:" + area());
}
}
public final class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
public non-sealed class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
public final class Square extends Rectangle {
public Square(double side) {
super(side, side);
}
}
在上面的示例中,Shape类使用sealed关键字声明为密封类,它只允许三个子类:Circle、Rectangle和Square。Circle和Square都是final类,不能有子类,而Rectangle则是非密封类,可以有任意数量的子类。
对于密封类,可以使用permits关键字列出允许的子类,这些子类必须在同一个源文件中定义,或者在同一个模块中导出。如果一个类要作为密封类的子类,可以使用sealed关键字声明为密封子类,或者使用non-sealed关键字声明为非密封子类。
在Shape类中定义了一个抽象方法area(),用于计算形状的面积,以及一个非抽象方法 printArea(),用于打印形状的面积。Circle类和Rectangle类分别实现了area() 方法,而Square 类继承了Rectangle类并重写了构造方法,以便使用一个参数来初始化正方形的宽度和高度。
Shape类及其子类测试代码如下:
public class ShapeTest {
public static void main(String[] args) {
Shape circle = new Circle(3);
circle.printArea(); // 输出:面积为:28.274333882308138
Shape rectangle = new Rectangle(4, 5);
rectangle.printArea(); // 输出:面积为:20.0
Shape square = new Square(6);
square.printArea(); // 输出:面积为:36.0
}
}
使用 Sealed Classes 的好处:
- 增强了类型安全:通过限制子类的数量,可以避免不必要的类型转换和运行时错误。
- 提高了代码可维护性:通过强制编译时检查所有的子类和实现类,可以让代码更易于理解和修改。
- 支持模式匹配:密封类和密封子类可以方便地用于模式匹配,从而简化了代码编写和维护。
- 支持框架设计:密封类可以用于设计框架和 API,可以限制用户自定义的子类的数量,从而保证框架和 API 的稳定性和安全性。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


