用 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 上找到。