Java 密封类

从 Java 15 开始,现在可以使用修饰符 sealed将类或者接口声明为密封类或者密封接口。

密封类或者接口限制其他类或者接口可以扩展或者实现它们。
从概念上讲,它是一种比访问修饰符更具声明性的方式来限制类或者接口作为父类或者父接口的使用。

密封类是限制其他类或者接口可以扩展的类或者接口。

sealed修饰符和 permits关键字

类或者接口的密封可以在声明时使用修饰符“密封”来完成。
然后,在任何 extendsimplements子句之后,permits子句指定允许扩展密封类的类。

保留关键字“permits”列出了所有可以直接扩展密封类的类。
列出的子类可以是“final”、非密封或者密封的。

例如,以下 Account声明指定了三个允许的子类:

sealed class Account
    permits CurrentAccount, SavingAccount, LoanAccount {
}
final class CurrentAccount extends Account {}
non-sealed class SavingAccount extends Account {}
sealed class LoanAccount extends Account permits HomeloanAccount, AutoloanAccount {}
final class HomeloanAccount extends LoanAccount{}
final class AutoloanAccount extends LoanAccount{}

在这里,我们只允许 3 个类扩展 Account类。
没有其他类可以扩展 Account类。

类似地,只有 HomeloanAccountAutoloanAccount只是 LoanAccount支持的两种帐户类型。

finalsealednon-sealed子类

允许的子类必须恰好具有以下修饰符之一来描述它如何继续由其超类启动的密封:

  • final 类不能进一步扩展。
  • 密封类只能由其允许的子类扩展。
  • 非密封类也可以由未知子类扩展。密封类不能将密封行为强制到其允许的子类。

密封类的包装

  • 密封类及其子类,都必须在同一个模块内。
  • 如果给定的模块是未命名的模块,则所有类必须在同一个包中。
  • 如果允许的类写在同一个 .java文件中,那么我们可以省略 permits关键字。
public sealed class Account {}		//Omits 'permits' keyword 
final class CurrentAccount extends Account {}
non-sealed class SavingAccount extends Account {}
sealed class LoanAccount extends Account {}		//Omits 'permits' keyword 
final class HomeloanAccount extends LoanAccount{}
final class AutoloanAccount extends LoanAccount{}

记录为密封类

我们可以在“密封”类或者接口的“许可”子句中有一个记录类。

记录类是隐式的“final”,可以用作密封类的子类。

日期:2020-09-17 00:09:44 来源:oir作者:oir