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

时间:2016-12-31 20:15:53

标签: java enums guava apache-commons

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

  public enum Tag {
    rename, duplicate, process, limit, encode, decode;
  };

现在地图的keyset应该包含来自枚举的值。如果我的键集包含枚举中不存在的值,那么我想将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);
  }

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

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

我正在使用Java7。

1 个答案:

答案 0 :(得分:6)

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

public Processor(Map<Tag, String> tasks) {
    // processor logic    
}

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

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