2011-06-28 13 views
21

tengo una enumeración, vamos a llamarlo A:Prolongación de una enumeración en Java

public enum A 
{ 
    A, 
    B 
} 

tengo una función que toma una enumeración A:

public void functionA(A enumA) 
{ 
    //do something 
} 

¿Cómo puedo crear otra enumeración, posiblemente llame a B que puedo pasar a functionA? ¿Algo como esto?

public enum B 
{ 
    C 
} 

functionA(B.C); 

Sé que no puede extender una enumeración, pero ¿qué otras opciones tengo disponible? ¿Cuál es la mejor manera de lograr esto?

+1

¿Qué esperas lograr al hacer esto? La razón por la cual 'functionA' toma un parámetro' A' es porque específicamente espera solo esos valores. Supongamos que de alguna manera puedes engañarlo para tomar otro valor de una enumeración extendida. ¿Cómo sabría la función qué hacer con él? –

+1

Estoy tratando de agregar una nueva enumeración que es similar a la existente, pero no tiene sentido agregar los valores también. Tenía la esperanza de no tener que modificar la función en absoluto para manejarlo. – user489041

+1

Sea más específico. Sería útil hablar sobre lo que hace realmente la función, y cuáles son los valores de enumeración reales, y por qué la nueva enumeración debe manejarse con la misma función. –

Respuesta

46

No puede.

Los tipos Enum son finales por diseño.

La razón es que cada tipo de enumeración debe tener solo los elementos declarados en la enumeración (como podemos usarlos en una instrucción switch, por ejemplo), y esto no es posible si permite extender el tipo.

que podría hacer algo como esto:

public interface MyInterface { 
    // add all methods needed here 
} 

public enum A implements MyInterface { 
    A, B; 
    // implement the methods of MyInterface 
} 

public enum B implements MyInterface { 
    C; 
    // implement the methods of MyInterface 
} 

en cuenta que no es posible hacer un switch con esta interfaz, a continuación. (O, en general, tiene un switch con un objeto que podría provenir de más de un enum).

+0

Si no puedo, ¿cuál sería la mejor manera de refactorizarlo? – user489041

+0

@ user489051: ver mi última edición. Hmm, es lo mismo que Peter publicó. –

+0

¿Esto elimina mi habilidad para encender la enumeración? Supongo que estaría activando una interfaz ahora – user489041

16

puede implementar una interfaz común

interface I { } 

enum A implements I { 
    A, B 
} 
enum B implements I { 
    C 
} 
public void functionA(I i) { 
    //do something 
} 

obj.functionA(A.A); 
obj.functionA(B.C); 
+2

Ahhh ... sí, esta es una buena solución – user489041

+4

¿Esto elimina mi capacidad de encender la enumeración? – user489041

+4

Sí lo hace .... – Robin

4

Debe añadir el artículo a su enumeración C A. Si se trata de algo no relacionado y añadiendo que no tiene sentido, funciónA() probablemente no debería ser el para manejarlo

5

No se puede hacer que las Enumeraciones amplíen otros Enum pero puede declarar una interfaz que todos sus Enumeces pueden implementar. La interfaz deberá incluir todos los métodos que espere invocar en sus valores Enum. Aquí está un ejemplo ...

public class Question6511453 { 
    public static void main(String[] args) { 
     System.out.println(functionFoo(EnumA.FirstElem)); 
     System.out.println(functionFoo(EnumA.SecondElem)); 
     System.out.println(functionFoo(EnumB.ThirdElem)); 
    } 

    private interface MyEnums { 
     int ordinal(); 
    } 

    private enum EnumA implements MyEnums { 
     FirstElem, 
     SecondElem 
    } 

    private enum EnumB implements MyEnums { 
     ThirdElem 
    } 

    private static int functionFoo(MyEnums enumeration) { 
     return enumeration.ordinal(); 
    } 
} 

El único problema con esta solución es que le quita su capacidad de utilizar la enumeración como lo haría normalmente gusta en los estados de conmutación debido a los ordinales y los valores pueden no ser único ya.

Esto debería responder a su pregunta, pero dudo que realmente lo ayude con su problema. :(

Cuestiones relacionadas