2008-10-04 11 views
6

¿Es posible, en Java, exigir que una clase tenga un conjunto específico de subclases y ninguna otra? Por ejemplo:¿Hay alguna manera de implementar tipos algebraicos en Java?

public abstract class A {} 
public final class B extends A {} 
public final class C extends A {} 
public final class D extends A {} 

¿Puedo de alguna manera hacer cumplir que ninguna otra subclase de A puede ser creada?

Respuesta

4

Proporcione la clase A un constructor con accesibilidad a nivel de paquete (y ningún otro constructor).

Gracias, Dave L., por lo de no hay otros constructores.

+0

clases Alternativamente todos como anidadas con A que tiene solamente un constructor privado. –

+0

Eso no es tan estético, sin embargo: A.B, A.C. ... –

+1

importación estática al rescate, marxidad – Apocalisp

0

Puede poner las clases A, B, C, D en un paquete separado y hacer que la clase A no sea pública.

+1

Hacer que clase A sea privada derrota el propósito de los tipos de datos algebraicos (es decir, polimorfismo) –

3

Probablemente desee una enumeración (Java> = 1.5). Un tipo enum 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. Una enumeración no puede ser extendida.

Ejemplo:

enum A { 

    B, 
    C, 
    D; 

    public int someField; 

    public void someMethod() { 
    } 


} 
+0

Si no me equivoco, en su ejemplo, B, C y D son valores, no tipos. – Apocalisp

+0

Ah, tienes razón ... no puedes crear muchas B :-( – asterite

+0

Pero es bueno si no quieres que los subtipos tengan estado (en el ejemplo, ni siquiera implementan ningún método). –

Cuestiones relacionadas