Ars*_*der 26
这就是 Java 17 具有密封类的原因。此功能作为预览功能添加到 Java 15 中。
根据您的情况,您可以执行以下操作:-
public sealed class A permits B {
}
public class B extends A{ //No error
}
public class C extends A{ //error because class C is not permitted
}
Run Code Online (Sandbox Code Playgroud)
允许类或接口的作者控制哪些代码负责实现它。
提供比访问修饰符更具声明性的方式来限制超类的使用。
通过为模式的详尽分析提供基础,支持模式匹配的未来方向。
如果您想要一个不可扩展的类,那么您可以使用final.
public final class A{ //Cannot be extended by other classes.
}
Run Code Online (Sandbox Code Playgroud)
https://docs.oracle.com/en/java/javase/15/language/sealed-classes-and-interfaces.html
http://openjdk.java.net/jeps/409
https://www.baeldung.com/java-sealed-classes-interfaces
如果您使用的是旧版本的 Java,自然的解决方案就是将类设为A包私有。这可以防止包外部的类A直接子类化。
如果A本身确实需要公开暴露,仍然有一个解决方案:声明另一个PublicA公共且最终的类,其中PublicA是 的子类,A没有附加或重写的成员。然后其他包中的类可以使用PublicA代替A,但它们不能子类化它。
PublicA和之间唯一的实际区别A是,该类B是 的子类A,但不是 的子类PublicA;例如,obj instanceof PublicA无法检测 的实例B或其他公共子类A。如果instanceof其他包中可能需要这样的检查,则可以公开实现的公共接口A,或者可以公开从包内部PublicA返回的静态方法(在允许的情况下)。arg instanceof A
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |