Java 15之后,密封类可以控制哪些模型、类等可以实现或扩展该类/接口。允许使用sealed修饰class,并通过permits明确写出能够从该class继承的子类名称。

1、使用示例

public sealed interface Service permits Car, Truck {
    int getMaxServiceIntervalInMonths();
    default int getMaxDistanceBetweenServicesInKilometers() {
    return 100000;
  }
}

相关文档http://openjdk.java.net/jeps/409

2、sealed密封类的作用

限制另一个接口扩展的接口。限制哪些类能够实现特定接口。

1)可以限制其他接口扩展的接口,并只为允许扩展该接口的某些特定接口制定规则。

例如,

public sealed interface MotherInterface permits ChildInterfacePermitted {}
//必须声明为密封或非密封
public non-sealed interface ChildInterfacePermitted extends MotherInterface {}  
public interface AnotherChildInterface extends MotherInterface {} 
//编译器错误!它不包含在MotherInterface的许可中

2)现在可以创建一个接口,并只选择允许实现该接口的特定类。不允许所有其他类实现它。

例如,

 public sealed interface MotherInterface permits ImplementationClass1 {} 
 //必须被定义为最终的,或者是密封的,或者是非密封的
 public final class ImplementationClass1 implements MotherInterface {} 
 public class ImplementationClass2 implements MotherInterface {} 
 //编译器错误!它不包含在MotherInterface的许可中

注意:密封类及其允许的子类必须属于同一模块,如果在未命名模块中声明,则属于同一软件包。每个允许的子类都必须直接扩展密封的类。

推荐文档