¿Hay alguna manera de implementar tipos algebraicos en Java?
-
05-07-2019 - |
Pregunta
¿Es posible, en Java, exigir que una clase tenga un conjunto específico de subclases y ninguna otra? Por ejemplo:
public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
¿Puedo imponer de alguna manera que no se puedan crear otras subclases de A?
Solución 4
Codificación de la iglesia al rescate:
public abstract class A {
public abstract <R> R fold(R b, R c, R d);
}
Solo hay tres implementaciones posibles:
public final class B extends A {
public <R> R fold(R b, R c, R d) {
return b;
}
}
public final class C extends A {
public <R> R fold(R b, R c, R d) {
return c;
}
}
public final class D extends A {
public <R> R fold(R b, R c, R d) {
return d;
}
}
Otros consejos
Proporcione a la clase A
un constructor con accesibilidad a nivel de paquete (y ningún otro constructor).
Gracias, Dave L., por el poco de ningún otro constructor.
Probablemente desee una enumeración (Java > = 1.5). Un tipo de enumeración puede tener un conjunto de valores fijos. Y tiene todas las ventajas de una clase: pueden tener campos y propiedades, y pueden hacer que implementen una interfaz. No se puede extender una enumeración.
Ejemplo:
enum A {
B,
C,
D;
public int someField;
public void someMethod() {
}
}
Podría poner las clases A, B, C, D en un paquete separado y hacer que la clase A no sea pública.