jdk17新特性之Sealed Classes详解

内容分享1个月前发布 hidizzy
0 0 0

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 的好处:

  1. 增强了类型安全:通过限制子类的数量,可以避免不必要的类型转换和运行时错误。
  2. 提高了代码可维护性:通过强制编译时检查所有的子类和实现类,可以让代码更易于理解和修改。
  3. 支持模式匹配:密封类和密封子类可以方便地用于模式匹配,从而简化了代码编写和维护。
  4. 支持框架设计:密封类可以用于设计框架和 API,可以限制用户自定义的子类的数量,从而保证框架和 API 的稳定性和安全性。
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...