我建议使用util的法像提到@Phil Anderson
。我只会将其更改为普通模式:
public static <T extends Enum<T>> void some_method(Class<T> clazz, String name) {
try {
T foundEnum = Enum.valueOf(clazz, name);
// name matches to one of enum values, do something with it
} catch (IllegalArgumentException e) {
// name doesn't matches to any of enum values
}
}
这情况下包含的语义看起来是这样的:
public static <T extends Enum<T>> boolean contains(Class<T> clazz, String name) {
try {
Enum.valueOf(clazz, name);
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
更新时间:
如前所述@phil-anderson
,从性能的角度来看,这种方法有一定的缺点,因为异常的产生和抛出很慢(见How slow are Java exceptions?)。但是这只是一个例子,如果方法调用的值不正确name
。
因此,在这种情况下,你可以使用此模式:
public static <T extends Enum<T>> void some_method(Class<T> clazz, String name) {
for (T each : clazz.getEnumConstants()) {
if (each.name().equals(name)) {
// name matches to one of enum values, do something with it
}
}
// name doesn't matches to any of enum values
}
此外,如果性能起着重要的作用,特别是如果枚举包含大量的值,它是没有效率的迭代(也许) 他们全部。该解决方案可能使用枚举的懒惰哈希映射并通过哈希码获取值。例如:
@SuppressWarnings("unchecked")
public static <T extends Enum<T>> void some_method(Class<T> clazz, String name) {
Map<String, Enum<?>> enumMap = enumsMap.get(clazz);
if (enumMap == null) {
enumMap = new HashMap<String, Enum<?>>();
for (T t : clazz.getEnumConstants()) {
enumMap.put(t.name(), t);
}
enumsMap.put(clazz, enumMap);
}
T t = (T) enumMap.get(name);
if (t != null) {
// name matches to one of enum values, do something with it
} else {
// name doesn't matches to any of enum values
}
}
第一个问题是为什么你首先需要这样的方法。但除此之外,在Java 8中,您可以使用接口和默认方法来实现此功能。另一个问题是否这是一个好主意。 – biziclop
为什么你的Color enum需要这种方法,如果它与Color无关? – Oli
@biziclop我知道这个Java8的一部分,但我仅限于Java 6这个特殊情况。 – vcaldas