Java 15的密封类简单说明 - jgeeks


Java 15引入了Sealed Classes,它允许类/接口限制其他哪些类/接口可以扩展或实现它们。这是一个例子:

public sealed class Vehicle permits Car, Truck, Motorcycle { ... }
 
final class Car extends Vehicle { ... }
final class Truck extends Vehicle { ... }
final class Motorcycle extends Vehicle { ... }

在上面的示例中,Vehicle是一个密封类,它指定了三个允许的子类;Car,Truck和Motorcycle。
子类必须是:

  • 在与超类相同的程序包或模块中。您甚至可以在与超类相同的源文件中定义它们,在这种情况下,可以不需要permits子句,因为编译器将从文件中的声明中推断出它们。
  • 声明三种选项:final(即不能进一步扩展);sealed(即以受限方式允许进一步的子类)或non-sealed(即允许任何类进行扩展)声明。

密封有两个主要目的:

  1. 它限制了哪些类或接口可以是类或接口的子类型,从而保留了API的完整性。[list=1]
  2. 它允许编译器列出密封类型的所有允许的子类型(穷举分析),这将在以后的Java版本中能启用切换密封类型的类型模式。例如,给定以下switch语句,编译器将检测到每个允许的子类都有一个case语句Vehicle(因此不需要default子句),并且如果缺少任何子句,还将产生错误:
    int doSomething(Vehicle v) {  return switch (v) {      case Car c -> ...      case Truck t -> ...      case Motorcycle m -> ...  };}