我想在这个答案描述创建这样几个枚举: Lookup enum by string value许多具有相同功能的枚举?
(即具有toString()和这对枚举本身不同名称的枚举)
是有什么方法可以重用此功能,而无需在每个枚举中重新实现它?
我想在这个答案描述创建这样几个枚举: Lookup enum by string value许多具有相同功能的枚举?
(即具有toString()和这对枚举本身不同名称的枚举)
是有什么方法可以重用此功能,而无需在每个枚举中重新实现它?
如果您在可能的值的列表中通过,那么你可以不用这么多,因为这取决于类型是一个enum
。
public static <T> T findByString(T[] values, String toString) {
Objects.requireNonNull(toString);
for (T t : values) {
if (toString.equals(t.toString())) {
return t;
}
}
throw new IllegalArgumentException();
}
调用具有:
Blah blah = SomeClass.findByString(Blah.values(), str);
每次
不需要调用Blah.values()
,你可以用把它放在一个对象,它可以通过周围,并用于一般。也许其他方法稍后添加。
public interface ByString<T> { // Choose a better name.
T find(String toString);
}
[...]
private static final ByString<Blah> blahs = byString(Blah.values());
[...]
public static <T> ByString<T> byString(T[] values) {
final T[] valuesCopy = values.clone();
return new ByString<T>() {
public T find(String toString) {
return SomeClass.findByString(valuesCopy, toString);
}
};
}
[...]
调用具有:
Blah blah = blahs.find(str);
事实上,你可能要以优化。做toString
荷兰国际集团一次,并使用地图。
public static <T> ByString<T> byString(T[] values) {
final Map<String,T> byToStrings = new HashMap<>(
(int)(values.length/0.75f)+1 // Doesn't HashMap construction suck.
);
for (T value : values) {
byToStrings.put(values.toString(), value);
}
return new ByString<T>() {
public T find(String toString) {
T value = byToStrings.get(toString);
if (value == null) {
throw new IllegalArgumentException();
}
return value;
}
};
}
我不相信你可以远离“添加字段和属性”,在每个枚举。你可以让你fromText
方法委托给一个共同的方法不过,如果你创建了该属性的接口,并通过其中values()
或(更好)的EnumSet
。 (更好:编写一种方法来创建不区分大小写的Map
,并在每次枚举中调用一次,将结果存储在一个静态变量中。)
如果您有许多共享相同功能的枚举,我也可以。
的Java 8将使这个虚拟扩展简单。它可以让你定义接口的默认实现(这必须是一个辅助/静态方法)
认为它可能更简单,只需拿走“命名”枚举!感谢你的回答。 – jabalsad 2012-03-07 08:54:55