用 Java 中的所有枚舉值填充列表
一、概述
Java 在 1.5 版本中引入了enum 。將常量定義為enum使代碼更具可讀性。此外,它允許編譯時檢查。
在本快速教程中,讓我們探討如何獲取包含enum類型的所有實例的List 。
二、問題介紹
像往常一樣,我們將通過一個例子來理解這個問題。
首先,讓我們創建一個enum類型MagicNumber :
enum MagicNumber {
ONE, TWO, THREE, FOUR, FIVE
}
然後,我們的目標是獲得一個包含MagicNumber enum的所有實例的List :
List<MagicNumber> EXPECTED_LIST = Arrays.asList(ONE, TWO, THREE, FOUR, FIVE);
在這裡,我們使用Arrays.asList()方法從數組初始化列表。
稍後,我們將探索幾種不同的方法來獲得預期的結果。最後,為簡單起見,我們將使用單元測試斷言來驗證每個方法是否給出了預期的結果。
那麼接下來,讓我們看看他們的行動。
3. 使用EnumType.values()方法
當我們準備EXPECTED_LIST,我們從一個數組中初始化它。因此,如果我們可以從數組中的enum中獲取所有實例,我們就可以構建列表並解決問題。
每個enum類型都提供標準的values()方法來返回數組中的所有實例。那麼接下來,讓我們從MagicNumber.values()建立一個列表:
List<MagicNumber> result = Arrays.asList(MagicNumber.values());
assertEquals(EXPECTED_LIST, result);
如果我們運行測試,它就會通過。所以,我們得到了預期的列表。
4. 使用EnumType.class.getEnumConstants()方法
我們已經看到使用enum類型的values()來獲取數組中的所有enum實例。這是一種標準且直接的方法。但是,我們需要確切地知道enum類型的名稱並將其硬編碼在代碼中,例如MagicNumber.values() 。換句話說,通過這種方式,我們無法構建適用於所有enum類型的實用方法。
從 Java 1.5 開始, Class對象提供了getEnumConstants()方法來從enum Class對像中獲取所有enum實例。因此,我們可以讓getEnumConstants()提供enum實例:
List<MagicNumber> result = Arrays.asList(MagicNumber.class.getEnumConstants());
assertEquals(EXPECTED_LIST, result);
如上面的測試所示,我們使用MagicNumber.class.getEnumConstants()來提供enum實例數組。此外,很容易構建適用於所有enum類型的實用方法:
static <T> List<T> enumValuesInList(Class<T> enumCls) {
T[] arr = enumCls.getEnumConstants();
return arr == null ? Collections.emptyList() : Arrays.asList(arr);
}
值得一提的是,如果Class對像不是enum類型,則getEnumConstants()方法返回null 。如我們所見,在這種情況下我們返回一個空List 。
接下來,讓我們創建一個測試來驗證enumValuesInList() :
List<MagicNumber> result1 = enumValuesInList(MagicNumber.class);
assertEquals(EXPECTED_LIST, result1);
List<Integer> result2 = enumValuesInList(Integer.class);
assertTrue(result2.isEmpty());
如果我們試一試,測試就會通過。如我們所見,如果類對像不在enum類型中,我們就有一個空列表。
5. 使用EnumSet.allOf()方法
從 1.5 版開始,Java 引入了一個特定的Set來處理enum類: EnumSet 。此外, EnumSet具有allOf()方法來加載給定enum類型的所有實例。
因此,我們可以使用ArrayList()構造函數和填充的EnumSet來構造一個List對象。那麼接下來,我們通過一個測試來看看它是如何工作的:
List<MagicNumber> result = new ArrayList<>(EnumSet.allOf(MagicNumber.class));
assertEquals(EXPECTED_LIST, result);
值得一提的是,調用allOf()方法以自然順序存儲enum的實例。
六,結論
在本文中,我們學習了三種獲取包含enum.所有實例的List對象的方法。
與往常一樣,此處提供的所有代碼片段都可以在 GitHub 上找到。