我有一张地图,我需要用枚举来验证地图的键集。我有一个枚举类,如下所示:
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。
答案 0 :(得分:6)
你做的工作太多了。实际上,您需要做的就是将地图中的密钥绑定到Tag
。
public Processor(Map<Tag, String> tasks) {
// processor logic
}
此保证传入的地图中的密钥只能 Tag
。您也不需要此方案中的异常,因为如果传递了无效密钥,您的代码将无法编译。此外,由于它是一个枚举,你不会得到任何不在该枚举中的键。
如果您正在处理字符串列表并且无法直接获取枚举,则可以使用Tag.valueOf("<string value here>")
进行转换。