Java-Aufzählungen: Liste der aufgezählten Werte aus einer Klasse <? erweitert Enum>

75

Ich habe das Klassenobjekt für eine Aufzählung (ich habe eine Class<? extends Enum>) und ich muss eine Liste der aufgezählten Werte erhalten, die durch diese Aufzählung dargestellt werden. Die valuesstatische Funktion hat das, was ich brauche, aber ich bin nicht sicher, wie ich vom Klassenobjekt darauf zugreifen kann.

Landon Kuhn
quelle
seine statische - Reflexion.
IAdapter
Classist ein Reflexionsobjekt (es ist älter als das Paket).
Tom Hawtin - Tackline

Antworten:

20

Wenn Sie den Namen des gewünschten Werts kennen:

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

Wenn Sie dies nicht tun, können Sie eine Reihe von ihnen erhalten (wie Tom es zuerst getan hat):

     klass.getEnumConstants();
Yishai
quelle
11

Das Verwenden von Reflection ist einfach, indem Sie Class # getEnumConstants () aufrufen :

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

Ich bin überrascht zu sehen, dass EnumSet#allOf()das nicht erwähnt wird:

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

Erstellt einen Aufzählungssatz, der alle Elemente des angegebenen Elementtyps enthält.

Beachten Sie Folgendes enum:

enum MyEnum {
  TEST1, TEST2
}

Rufen Sie die Methode einfach so auf:

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

Dies gibt natürlich a zurück Set, nicht a List, aber es sollte in vielen (den meisten?) Anwendungsfällen ausreichen.

Oder wenn Sie ein Unbekanntes haben enum:

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

Der Vorteil dieser Methode im Vergleich zu Class#getEnumConstants()ist, dass sie so typisiert ist, dass nichts anderes als eine enuman sie übergeben werden kann. Der folgende Code ist beispielsweise gültig und gibt Folgendes zurück null:

String.class.getEnumConstants();

Dies wird zwar nicht kompiliert:

EnumSet.allOf(String.class); // won't compile
Magnilex
quelle
Es sieht so aus, als würde diese Methode viel schneller sein. Die Reflection-Methode klont ein gemeinsam genutztes Array, das mithilfe von Reflection und der Sicherheits-API erstellt wurde. Der EnumSetverwendet einen "Bitvektor", der in a gespeichert ist long.
Jeff Walker