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

Elegant way to validate keyset of a map with an enum?

我有一张地图,我需要在其中使用我的枚举验证地图的键集。我有一个枚举 class 如下所示:

  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。

你做的有点多了。实际上,您需要做的就是将地图中的键绑定到 Tag.

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

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

如果你正在处理一个字符串列表,而你不能直接得到枚举,那么你可以使用Tag.valueOf("<string value here>")来转换它。