2010-02-04 2 views
12

Gibt es eine Möglichkeit, eine generische Schleife zu schreiben, um über eine beliebige Enum zu iterieren? Zum Beispiel:Wie schreibe ich eine generische for-Schleife für ein Java Enum?

public static void putItemsInListBox(Enum enum, ListBox listbox){ 
    for(Enum e : enum.values(){ 
     listBox.addItem(e.toString(), String.valueOf(e.ordinal()); 
    } 
} 

Sie können die oben nicht tun, weil die Enum-Klasse keine Methode namens values ​​() wie die implementierten Enum-Klassen haben. Die obige for-Schleife funktioniert für eine Klasse, die als enum definiert ist.

+0

Wie Sie eine Reihe von Aufzählungen nicht eine ENUM wollen, würde ich in einem Passieren vorschlagen 'Iterable' oder so etwas. –

Antwort

21

Es funktioniert genauso, als ob die Class geben:

public static <E extends Enum<?>> void iterateOverEnumsByInstance(E e) 
{ 
    iterateOverEnumsByClass(e.getClass()); 
} 

public static <E extends Enum<?>> void iterateOverEnumsByClass(Class<E> c) 
{ 
    for (E o: c.getEnumConstants()) { 
     System.out.println(o + " " + o.ordinal()); 
    } 
} 

Verbrauch:

enum ABC { A, B, C } 
... 
iterateOverEnumsByClass(ABC.class); 
iterateOverEnumsByInstance(ABC.A); 
+1

+1 Danke, ich habe etwas Neues über den Zugriff auf Aufzählungselemente gelernt! –

+0

Ich mag diese Antwort, obwohl, würde Ich mag die Methodensignatur ein wenig zu ändern, sollte die Unterschrift sein: public static > void iterateOverEnumsByInstance (E e) und public static > void iterateOverEnumsByClass (Klasse c) – Nick

2

Das ist billig, aber funktionieren soll (zumindest nach meinem Test):

public static <T extends Enum<T>> void putItemsInListBox(Class<T> cls, ListBox listbox) { 
    for (T item : EnumSet.allOf(cls)) 
     listbox.addItem(item.toString(), String.valueOf(item.ordinal())); 
} 

Das funktioniert, weil EnumSet spezielle magischen Zugang zu nicht-öffentlichen Mitgliedern Enum hat, die es die ENUM des aufzuzählen erlaubt Werte trotz des Fehlens einer values Methode.

+0

Es ist keine Magie. Jeder Aufzählungstyp "T" hat eine statische Methode * T [] T.values ​​() '. 'EnumSet' verwendet Reflektion, um darauf zuzugreifen, benötigt dafür jedoch keine speziellen Privilegien. – finnw

+1

@finnw: Es verwendet keine Reflexion! (Siehe Implementierung von 'EnumSet.getUniverse'.) Es verwendet etwas sehr ähnlich wie @ axtavts Antwort (' getEnumConstants'), aber auf eine magischere Art und Weise ('SharedSecrets.getJavaLangAccess(). GetEnumConstantsShared'). –

+0

Wie auch immer, die Antwort von axtavt ist besser als meine, deshalb ermutige ich alle, das stattdessen zu verbessern. :-P –

Verwandte Themen