Java 使用枚举验证映射键集的优雅方法?
我有一个映射,其中我需要用我的枚举验证映射的键集。我有一个enum类,如下所示:Java 使用枚举验证映射键集的优雅方法?,java,enums,guava,apache-commons,Java,Enums,Guava,Apache Commons,我有一个映射,其中我需要用我的枚举验证映射的键集。我有一个enum类,如下所示: public enum Tag { rename, duplicate, process, limit, encode, decode; }; 现在映射的键集应该具有上面枚举中的值。如果我的键集包含枚举中不存在的值,则我希望抛出枚举中缺少该值的IllegalArgumentException 下面是我的代码: public Processor(Map<String, String>
public enum Tag {
rename, duplicate, process, limit, encode, decode;
};
现在映射的键集
应该具有上面枚举中的值。如果我的键集包含枚举中不存在的值,则我希望抛出枚举中缺少该值的IllegalArgumentException
下面是我的代码:
public Processor(Map<String, String> tasks) {
Set<String> keyset = tasks.keySet();
for (String tag : keyset)
checkArgument(!EnumUtils.isValidEnum(Tag.class, tag), "unknown tag found '%s'.", tag);
}
公共处理器(映射任务){
Set keyset=tasks.keyset();
用于(字符串标记:键集)
checkArgument(!EnumUtils.isValidEnum(Tag.class,Tag),“找到了未知的标记'%s'”,Tag);
}
如您所见,我正在迭代键集
并执行预条件。checkArgument
检查。如果它不在那里,那么它将抛出IllegalArgumentException
。不过,我相信投掷信息是可以改进的
我的问题是:有没有比我现在做的更好的方法来做同样的事情?我是否必须迭代for循环中的键集来执行检查?或者是否有任何一种线性或其他更好的方法来进行验证
我正在使用Java7。您做的工作有点太多了。实际上,您只需将地图中的密钥绑定到标记
public Processor(Map<Tag, String> tasks) {
// processor logic
}
公共处理器(映射任务){
//处理器逻辑
}
这保证了传入的映射中的键只能是Tag
。在这个方案中,您也不需要异常,因为如果传递了无效的密钥,代码将无法编译。另外,因为它是一个枚举,所以您不会得到任何不在该枚举中的键
如果您正在处理字符串列表,而无法直接获取枚举,则可以使用标记.valueOf(“”
来转换它。如果您希望地图具有标记
枚举中的键,它实际上不应该是地图
。只需使用地图
?甚至可能是一个EnumMap
?用户想要抛出IllegalArgumentException…你的代码中抛出的是什么?@prashant你不需要抛出它。这将对映射进行编译时检查,而不是运行时检查。我们已经在您的回答中对此进行了详细讨论,我看不出有任何理由在这里重复。但用户希望抛出@Makoto…这可能是为了一个商业案例,他希望跟踪此类事件…..我已经解决了用户的需要…..这不是我刚刚提出的东西…..这是用户……你对我的否决没有逻辑answer@prashant:OP也在寻求更好的方法来实现这一点,所以我提供了一个。他们是否可以使用它是一回事(尽管我确实怀疑他们可以-即使将字符串转换为标记
枚举值),但我对为这个问题提供了一个合适的答案感到非常满意。