2010-02-04 46 views
12

有沒有辦法編寫一個通用循環遍歷任意枚舉? 例如:如何爲Java Enum編寫泛型循環?

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

你不能做上述情況,因爲枚舉類沒有一個方法叫做值()之類的實現枚舉類。上面的for循環對於定義爲枚舉類的類可以很好地工作。

+0

當你想要一組枚舉不枚舉,我建議通過在'Iterable'或者其他。 – 2010-02-05 05:24:50

回答

21

它的工作原理完全相同的方式一樣,如果Class傳遞:

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

用法:

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

+1謝謝,我學到了一些關於如何訪問枚舉成員的新東西! – 2010-02-04 23:25:15

+0

我喜歡這個答案,雖然,我想修改方法簽名比特,簽名應該是: 公共靜態>無效iterateOverEnumsByInstance(E E) 和 公共靜態> void iterateOverEnumsByClass(Class c) – Nick 2010-02-05 16:04:21

2

這是便宜,但應該工作(至少根據我的測試):

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

這工作,因爲EnumSet有特殊的魔力訪問的Enum非公共成員,這使得它能夠枚舉枚舉的值儘管缺少values方法。

+0

這不是魔術。每個枚舉類型'T'都有一個* public *靜態方法'T [] T.values()'。 'EnumSet'使用反射來訪問它,但它不需要特殊的權限來執行它。 – finnw 2010-02-04 23:18:55

+1

@finnw:它不使用反射! (參見'EnumSet.getUniverse'的實現。)它使用非常類似於@ axtavt的回答('getEnumConstants')的東西,但是以更神奇的方式('SharedSecrets.getJavaLangAccess()。getEnumConstantsShared')。 – 2010-02-04 23:20:40

+0

無論如何,axtavt的答案比我的好,所以我鼓勵所有人都去注意這個。 :-P – 2010-02-04 23:25:56