使用枚举验证地图键集的优雅方法?
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>")
来转换它。
我有一张地图,我需要在其中使用我的枚举验证地图的键集。我有一个枚举 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>")
来转换它。