2009-02-06 45 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