Java 15引入了Sealed Classes,它允许类/接口限制其他哪些类/接口可以扩展或实现它们。这是一个例子:
public sealed class Vehicle permits Car, Truck, Motorcycle { ... } |
在上面的示例中,Vehicle是一个密封类,它指定了三个允许的子类;Car,Truck和Motorcycle。
子类必须是:
- 在与超类相同的程序包或模块中。您甚至可以在与超类相同的源文件中定义它们,在这种情况下,可以不需要permits子句,因为编译器将从文件中的声明中推断出它们。
- 声明三种选项:final(即不能进一步扩展);sealed(即以受限方式允许进一步的子类)或non-sealed(即允许任何类进行扩展)声明。
密封有两个主要目的:
- 它限制了哪些类或接口可以是类或接口的子类型,从而保留了API的完整性。[list=1]
- 它允许编译器列出密封类型的所有允许的子类型(穷举分析),这将在以后的Java版本中能启用切换密封类型的类型模式。例如,给定以下switch语句,编译器将检测到每个允许的子类都有一个case语句Vehicle(因此不需要default子句),并且如果缺少任何子句,还将产生错误:
int doSomething(Vehicle v) { return switch (v) { case Car c -> ... case Truck t -> ... case Motorcycle m -> ... };}