Supongamos que hay una clase A que es una clase padre y una clase B que extiende A .
Ahora no debería permitir extender la clase A a la clase C ( class C extends A ), o cualquier otra clase.
¿Como hacer eso?
Es por eso que Java 17 tiene clases selladas. Esta función se agregó como una función de vista previa en Java 15.
En su caso, puede hacer lo siguiente:-
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 }Permita que el autor de una clase o interfaz controle qué código es responsable de implementarla.
Proporcione una forma más declarativa que los modificadores de acceso para restringir el uso de una superclase.
Apoye las direcciones futuras en la coincidencia de patrones proporcionando una base para el análisis exhaustivo de patrones.
SI desea una clase no extensible, puede usar final .
public final class A{ //Cannot be extended by other classes. }https://docs.oracle.com/en/java/javase/15/language/sealed-classes-and-interfaces.html
http://openjdk.java.net/jeps/409
Si está utilizando una versión anterior de Java, la solución natural es simplemente hacer que el paquete de clase A sea privado. Esto evita que las clases fuera del paquete subclasifiquen A directamente.
Si A sí mismo necesita ser expuesto públicamente, todavía hay una solución: declarar otra clase PublicA que sea pública y final, donde PublicA es una subclase de A sin miembros adicionales o anulados. Luego, las clases en otros paquetes pueden usar PublicA en lugar de A , pero no pueden subclasificarlo.
La única otra diferencia práctica entre PublicA y A es que la clase B es una subclase de A pero no una subclase de PublicA ; entonces, por ejemplo obj instanceof PublicA no funcionará para detectar instancias de B u otras subclases públicas de A Si se puede requerir una instanceof de verificación como esta en otros paquetes, entonces se puede exponer una interfaz pública que implementa A , o PublicA puede exponer un método estático que devuelve arg instanceof A desde el interior del paquete, donde está permitido.
Desde Java 15 en adelante, dicho caso de uso se puede implementar mediante el uso de un modificador sellado y una cláusula de permisos.
La restricción de una clase o interfaz para convertirse en padre de una clase o interfaz específica. Los siguientes son dos casos de uso, uno para clase y otro para interfaz .
1. Uso de Clase: supongamos que tenemos una clase ClazzA, queremos restringir esta clase para que se extienda solo por la clase ClazzB. Esa es ninguna otra clase puede extender ClazzA excepto ClazzB.
public abstract sealed class ClazzA permits ClazzB { final String str; public ClazzA(String str) { this.str = str; } public void method() { // TODO } }2. Uso de la interfaz: supongamos que tenemos una interfaz InterfaceA, queremos restringir esta interfaz para que se extienda solo por la interfaz InterfaceB. Esa es ninguna otra interfaz que pueda extenderse excepto InterfaceB
public sealed interface InterfaceA permits InterfaceB { int method1(); default int defaultMethod() { return 0; } }