从 Java 15 开始,现在可以使用修饰符 sealed
将类或者接口声明为密封类或者密封接口。
密封类或者接口限制其他类或者接口可以扩展或者实现它们。
从概念上讲,它是一种比访问修饰符更具声明性的方式来限制类或者接口作为父类或者父接口的使用。
密封类是限制其他类或者接口可以扩展的类或者接口。
sealed
修饰符和 permits
关键字
类或者接口的密封可以在声明时使用修饰符“密封”来完成。
然后,在任何 extends
和 implements
子句之后,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
类。
类似地,只有 HomeloanAccount
和 AutoloanAccount
只是 LoanAccount
支持的两种帐户类型。
final
、sealed
和 non-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