2010-02-04 20 views
12

Rasgele bir Enum üzerinde yinelemek için genel bir döngü yazmanın bir yolu var mı? Örneğin : Enum sınıfı uygulanan numaralandırma sınıflarının gibi bir yöntemi denir değerler() olmadığındanJava Enum için genel bir döngü için nasıl yazabilirim?

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

Sen, yukarıda yapamaz. Yukarıdaki for döngüsü bir enum olarak tanımlanan bir sınıf için iyi çalışır.

+0

, bir de geçen öneririm 'Değiştirilebilir' veya somesuch. –

cevap

21

:

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()); 
    } 
} 

Kullanımı: değil çeteleler kümesi Bir enum istediğim gibi

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

+1 Teşekkür ederim, numaralandırma üyelerine nasıl ulaşacağınız konusunda yeni bir şeyler öğrendim! uzanır> ve ortak static iterateOverEnumsByInstance (E e) geçersiz: –

+0

Ben yöntem imzası biraz değiştirmek istiyorum, her ne kadar, imza olmalıdır bu konuda yanıt almak Enum > geçersiz iterateOverEnumsByClass (Sınıf c) genişletir – Nick

2

Bu (en azından benim teste göre) ucuz ama çalışması gerekir: EnumSet o enum 's numaralandırmak sağlar Enum olmayan kamu üyelerine özel büyülü erişimi olduğundan bu işleri

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())); 
} 

values yönteminin eksik olmasına rağmen değerler.

Tam Class geçirildiği takdirde aynı şekilde çalışır
+0

Bu sihir değil. Her bir T tipi "T" türünde bir * public * statik yöntemi vardır: T [] T.values ​​() '. EnumSet, ona erişmek için yansıma kullanır ancak bunu yapmak için özel ayrıcalıklara gerek yoktur. – finnw

+1

@finnw: Yansıma kullanmıyor! (Bkz. "EnumSet.getUniverse" nin uygulanması.) @ Axtavt'ın cevabı ('getEnumConstants') gibi daha çok şey kullanır, ama daha büyülü bir şekilde kullanır (' SharedSecrets.getJavaLangAccess(). GetEnumConstantsShared'). –

+0

Her neyse, axtavt'un cevabı benimkinden daha iyi, bu yüzden herkesi bunun yerine geçmeye teşvik etmeliyim. : -P –