2009-02-06 44 views
2

java標準庫中是否有一種方便的方法來檢查EnumMap中所有可能的鍵是否映射到一個值?檢查是否所有的枚舉值都被映射了?

我可以寫我自己喜歡的方法:

public static <T extends Enum<T>> boolean areAllValuesMapped(EnumMap<T, ?> map, Class<T> enumClass) 
{ 
    return map.keySet().equals(EnumSet.allOf(enumClass)); 
} 

但後來我不停地重複Class參數(在EnumMap的構造已經給出)以及創建一次性密鑰集和EnumSet對象。 EnumMap應該有足夠的信息來作爲內部操作來有效地執行此操作。

回答

5

沒有內置的方法來做到這一點,我可以在EnumMap找到(我檢查了源代碼是肯定的)。但是,這裏有一個稍微更快的方法:

public static <T extends Enum<T>> boolean areAllValuesMapped(EnumMap<T,?> map, Class<T> enumClass) { 
    return map.size() == enumClass.getEnumConstants().length; 
} 

我要指出,EnumMap.keySet()不返回EnumSet;如果是這樣,您使用的equals()呼叫將是比較longs的一個簡單問題。實際上,它必須使用迭代器並逐一檢查每個枚舉常量。

+1

請注意,Class#getEnumConstants()克隆了基礎數組;如果緩存大小是可能的,這可能是值得避免的成本。另外,請注意,如果類實際上並沒有擴展`Enum`,Class#getEnumConstants()將返回null。在這裏,你已經正確地限定了類型參數`T`來防範這種情況,所以我猜如果調用者在一個非法類中做了一些不合理的轉換,遇到拋出的`NullPointerException`將是一個可以接受的懲罰。拋出`IllegalArgumentException`也是合適的。通常我寫`assert null!=常量;`。 – seh 2011-06-24 23:51:59