[英]Java: Hashmap of Enum subset elements
我在Java中有一個很大的枚舉,我想將其分解為子集(我認為我可以使用EnumSet做到這一點)。 然后,我希望能夠僅創建EnumSet中的元素的哈希圖或枚舉圖。 請問我該如何實現?
public enum Test { ENUM1, ENUM2, ENUM3, ENUM4, ENUM5 }
EnumSet<Test> testSet = EnumSet.range(ENUM2, ENUM4);
HashMap<testSet, String> testHashMap; <--- Compilation Failure
編輯: 我希望能夠創建哈希集,使其僅具有EnumSet的可用枚舉的鍵,並為EnumSet中的每個枚舉分配一個唯一的字符串值。
謝謝!
testSet
是EnumSet
的實例。 您想將鍵類型定義為EnumSet<Test>
:
HashMap<EnumSet<Test>, String> testHashMap = new HashMap<>();
...
testHashMap.put(testSet, "string");
聽起來您想要的是HashMap<Test, String>
,您將不得不自己將限制強制到指定范圍。 您無法在Java的類型系統級別對該限制進行編碼。
我不認為您可以像示例中那樣進行編譯時檢查-除非您實際上將枚舉拆分為多個較小的枚舉。 在運行時,有一些選項。
如果可能的話,我將創建地圖 EnumMap<Test, String>
的不可修改視圖 。 這實際上將映射鍵限制為您選擇的任何Enum常量。
實際地圖仍然可變。 如果需要在您的控制下更改字符串,則可以在內部進行操作,但只能將不可變的映射公開。 如果每個人都需要更改字符串,則可以使用諸如不可修改的EnumMap<Test, StringHolder>
類的東西EnumMap<Test, StringHolder>
並用所需的枚舉范圍和空的持有者預先填充它( StringHolder
是一個簡單的pogo,帶有getter和setter表示單個字符串值(類似於可變字符串)。
另一個選擇是您自己的地圖類型(由HashMap
或EnumMap
)。 每當創建新密鑰時,請檢查testSet
並在該密鑰不在其中時引發異常。
不幸的是,您將不得不擴展HashMap
。 每次添加元素時,都必須對照EnumSet進行檢查。
public class EnumSetMap<E, V> extends HashMap<E, V> implements Map<E, V> {
private EnumSet<E> allowed;
public EnumSetMap(EnumSet<E> allowed) {
this.allowed = allowed;
}
@Override
public V put(E key, V value) {
if (allowed.contains(element))
throw new IllegalArgumentException("Key must be in the Enum set.");
return super.put(E, V);
}
}
您的示例代碼將變為:
HashMap<Test, String> = new EnumSetMap<Test, String>(testSet);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.