2009-10-26 15 views
49

Ho l'oggetto di classe per un enum (ho un Class<? extends Enum>) e ho bisogno di ottenere un elenco dei valori enumerati rappresentati da questo enum. La funzione statica values ha ciò di cui ho bisogno, ma non sono sicuro di come accedervi dall'oggetto classe.Java Enum: elenca i valori enumerati da una classe <? estende Enum>

+0

sua statica - riflessione. – IAdapter

+0

'Class' è un oggetto riflesso (precede il pacchetto). –

risposta

10

utilizzando riflessione è semplice come chiamare Class#getEnumConstants():

List<Enum> enum2list(Class<? extends Enum> cls) { 
    return Arrays.asList(cls.getEnumConstants()); 
} 
16

Se si conosce il nome del valore è necessario:

 Class<? extends Enum> klass = ... 
    Enum<?> x = Enum.valueOf(klass, "NAME"); 

Se non lo fai, è possibile ottenere una serie di loro da (come Tom ha avuto modo di prima):

 klass.getEnumConstants(); 
3

sono sorpreso di vedere che EnumSet#allOf() non specificato:

public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)

Crea un set enum contenente tutti gli elementi del tipo di elemento specificato.

Si consideri il seguente enum:

enum MyEnum { 
    TEST1, TEST2 
} 

Basta chiamare il metodo come questo:

Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class); 

Naturalmente, questo restituisce una Set, non un List, ma dovrebbe essere sufficiente a molti (più?) casi d'uso.

Oppure, se si dispone di uno sconosciuto enum:

Class<? extends Enum> enumClass = MyEnum.class; 
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass); 

Il vantaggio di questo metodo, rispetto a Class#getEnumConstants(), è che viene digitato in modo che non è possibile passare qualcosa di diverso da un enum ad esso . Ad esempio, il codice seguente è valida e restituisce null:

String.class.getEnumConstants(); 

Anche se questo non compilerà:

EnumSet.allOf(String.class); // won't compile 
Problemi correlati