sealed

sealed 翻译为密封,密封类(Sealed Classes)的首次提出是在 Java15 的 JEP 360 中,并在 Java 16 的 JEP397 再次预览,而在 Java 17 的 JEP 409 成为正式的功能。
Sealed Classes 主要特点是限制继承
Sealed Classes 主要特点是限制继承,Java 中通过继承增强,扩展了类的能力,复用某些功能。当这种能力不受控。与原有类的设计相违背,导致不预见的异常逻辑。
Sealed Classes 限制无限的扩张
Java 中已有 sealed 的设计

  1. final 关键字,修饰类不能被继承
  2. private 限制私有类
    sealed 作为关键字可在 class 和 interface 上使用,结合 permits 关键字。定义限制继承的密封类。

Sealed Classes

  1. 声明 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. 声明子类
子类声明有三种

  1. final 终结,依然是密封的
  2. sealed 子类是密封类,需要子类实现
  3. 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

密封接口同密封类。

  1. 声明密封接口
public sealed interface SomeService permits SomeServiceImpl {
    void doThing();
}
  1. 实现接口
    public final class SomeServiceImpl implements SomeService {
    @Override
    public void doThing() {
    }
    }
    以上类和接口要在同一包可访问范围内。
posted @ 2023-04-28 21:16  HopeLive  阅读(250)  评论(0)    收藏  举报