2009-10-26 5 views
49

Ich habe das Klassenobjekt für eine enum (ich habe eine Class<? extends Enum>) und ich brauche eine Liste der aufgezählten Werte, die durch diese enum dargestellt werden. Die statische Funktion values hat, was ich brauche, aber ich bin mir nicht sicher, wie man vom Klassenobjekt darauf zugreifen kann.Java Enums: Aufzählung Werte von einer Klasse <? extends Enum>

+0

seine statische - Reflexion. – IAdapter

+0

'Class' ist ein Reflexionsobjekt (es ist älter als das Paket). –

Antwort

10

mit Reflexion einfach Class#getEnumConstants() als Aufruf:

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

Wenn Sie den Namen des Wertes kennen Sie brauchen:

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

Wenn Sie das nicht tun, Sie können eine Reihe von ihnen bekommen (wie Tom zuerst kam):

 klass.getEnumConstants(); 
3

Ich suprised nicht erwähnt zu sehen, dass EnumSet#allOf() wird:

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

Erzeugt eine ENUM-Satz alle Elemente in der angegebenen Elementtyp enthält.

Betrachten Sie die folgende enum:

enum MyEnum { 
    TEST1, TEST2 
} 

Einfach das Verfahren wie folgt aufrufen:

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

Natürlich, das gibt ein Set, kein List, aber es sollte genug sein, in viele (meistens?) Anwendungsfälle.

Oder, wenn Sie haben eine unbekannte enum:

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

Der Vorteil dieses Verfahrens im Vergleich zu Class#getEnumConstants(), ist, dass es eingegeben wird, so dass es nicht möglich ist, etwas zu passieren anderes als ein enum es . Zum Beispiel ist der Code unten gültig und gibt null:

String.class.getEnumConstants(); 

Während dies nicht kompiliert werden:

EnumSet.allOf(String.class); // won't compile 
Verwandte Themen