使用枚举验证地图的键集的优雅方法?

2 java enums apache-commons guava

我有一张地图,我需要用我的枚举来验证地图的键集.我有一个枚举类,如下所示:

  public enum Tag {
    rename, duplicate, process, limit, encode, decode;
  };
Run Code Online (Sandbox Code Playgroud)

现在keyset,map应该包含来自enum的值.如果我的键集包含枚举中没有的值,那么我想抛出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);
  }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我正在迭代keyset并进行Preconditions.checkArgument检查.如果它不存在那么就会抛出IllegalArgumentException.我确信抛出的信息可以改进.

我的问题是:与我正在做的相比,有没有更好的方法做同样的事情?我是否必须keyset在for循环中迭代才能进行检查?或者是否有任何一个班轮或任何其他更好的方法来进行此验证?

我使用的是Java7.

Mak*_*oto 6

你做的工作太多了.实际上,您需要做的就是将地图中的密钥绑定到Tag.

public Processor(Map<Tag, String> tasks) {
    // processor logic    
}
Run Code Online (Sandbox Code Playgroud)

保证了传入的地图中的键只能Tag.您也不需要此方案中的例外,因为如果传递了无效密钥,您的代码将无法编译.此外,由于它是一个枚举,你不会得到任何不在那个枚举中的键.

如果您正在处理字符串列表并且无法直接获取枚举,那么您可以使用Tag.valueOf("<string value here>")它来转换它.