2011-03-02 24 views
6

Me gustaría poder definir una clase Enum que incluiría otro Enum así como sus propios valores. Por ejemplo,:Java Enum haciendo referencia a otra enumeración

public enum A { 
    A1, A2, A3; 
} 

public enum B{ 
    B1, B2, ...(somehow define references to all values in enum A) 
} 

tal que cualquier valores contenidos en enum B debe ser o INITSELF (tales como B1, B2) o cualquiera de los valores de enum A. definen

Gracias,

+1

¿por qué tendrías que extender una enumeración? – Woot4Moo

Respuesta

5

Tal que B es la unión de A y B? Eso no es posible sin B extendiendo A, que es not supported en java. La manera de proceder es crear un enum que contiene los valores combinados de A y B, por ejemplo,

enum C { 
    A1, A2, A3, B1, B2; 
} 
+0

(Eso sería 'A' extendiendo' B'.) –

1

algo como esto?

enum A { 
    A1, A2; 
} 

enum B { 
    B1(null), 
    B2(null), 
    A1(A.A1), 
    A2(A.A2); 

    private final A aRef; 
    private final B(A aRef) { 
     this.aRef = aRef; 
    } 
} 
+0

Gracias a todos por sus respuestas. Parece que no hay una manera fácil de hacer lo que tenía en mente. En su lugar, opté por utilizar una clase java plan para emular dicha función. – MikeMY

1

Lo más que se puede conseguir es que A y B implementen una interfaz compartida.

enum A implements MyEnum{A1,A2} 
enum B implements MyEnum{B1,B2} 

MyEnum e = B.B1; 

Esta solución no funciona con la declaración del interruptor ni con las colecciones de enumeración optimizadas.

Su caso de uso no es compatible con la implementación de Java enum, fue complejo de implementar (en comparación con su utilidad) o no apareció (ninguno de los pocos idiomas que conozco lo admiten directamente) .

2

Normalmente, dado que estamos trabajando en Java, y generalmente nos oponemos al diseño OO, puede obtener esta funcionalidad a través de la extensión. Sin embargo, las enumeraciones extienden java.lang.Enum implícitamente y, por lo tanto, no pueden extender otra clase.

Esto significa que la extensibilidad para enums se deriva de una fuente diferente.

Joshua Bloch lo dice en Effective Java: Second Edition en el elemento 34, cuando presenta un patrón de interfaz compartido para enums. Aquí está su ejemplo del patrón:

public interface Operation { 
     double apply(double x, double y); 
    } 

    public enum BasicOperation implements Operation { 
     PLUS("+") { 
      public double apply(double x, double y) { return x + y; } 
     }, 
     MINUS("-") { 
      public double apply(double x, double y) { return x - y; } 
     }, 
     TIMES("*") { 
      public double apply(double x, double y) { return x * y; } 
     }, 
     DIVIDE("/") { 
      public double apply(double x, double y) { return x/y; } 
    } 

Esto es lo más cerca que se puede llegar al estado compartido cuando se trata de enumeraciones. Como dijo Johan Sjöberg anteriormente, podría ser más fácil simplemente combinar las enumeraciones en otra enumeración.

¡La mejor de las suertes!

Cuestiones relacionadas