Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用枚举验证映射键集的优雅方法?_Java_Enums_Guava_Apache Commons - Fatal编程技术网

Java 使用枚举验证映射键集的优雅方法?

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>

我有一个映射,其中我需要用我的枚举验证映射的键集。我有一个enum类,如下所示:

  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也在寻求更好的方法来实现这一点,所以我提供了一个。他们是否可以使用它是一回事(尽管我确实怀疑他们可以-即使将字符串转换为
标记
枚举值),但我对为这个问题提供了一个合适的答案感到非常满意。