我有很多类定义了一些枚举,我希望从用户输入的字符串加载其值。所以我发现自己在重复这个方法:
public final class Status {
public static enum TYPE { Slow, Haste, Sleep, Stop, Stone, Invis, Rage,
Conf, Bleed, Weak, Dumb, Sil, Rot, Lev, Clumsy };
public static Set<Status.TYPE> typesFromString(String string) {
EnumSet<Status.TYPE> set = EnumSet.noneOf(Status.TYPE.class);
if (string == null)
return set;
String[] elements = string.split(",");
for (String element : elements) {
element = element.trim();
for (TYPE type : EnumSet.allOf(Status.TYPE.class)) {
if (type.toString().equalsIgnoreCase(element)) {
set.add(type);
break;
}
}
}
return set;
}
也就是说,给定一个包含与枚举条目匹配的逗号分隔元素的字符串,返回一个由每个匹配项填充的集合。
我很想使这个通用,所以我不必维护它的十个不同副本,但我不太清楚如何在返回一组枚举的同时使这个通用。我认为它看起来隐约类似于以下方法:
public static Set<[Enum Class Specified in Argument]> setFromString(String string, [Class of Enum to Work With]) {
Set<E extends Enum<E>> set = EnumSet.noneOf([Class of Enum]);
if (string == null)
return set;
for (String element : string.split(",")) {
element = element.trim().toLowerCase();
for ([Element of Enum] type : EnumSet.allOf([Class of Enum])) {
if (type.toString().trim().toLowerCase().equals(element))
set.add(type);
}
}
}
return set;
最佳答案
您需要在修饰符 ( <E extends Enum<E>
) 和返回值 ( public static
) 之间指定泛型参数 ( Set<E>
)。并将 Class
作为参数传递枚举( Class<E>
clazz`)。应该看起来像这样:
public static <E extends Enum<E>> Set<E> parseValues(
String string, Class<E> clazz
) {
EnumSet<E> set = EnumSet.noneOf(clazz);
if (string == null) {
return set; // ( better, NPE )
}
String[] elements = string.split(",");
for (String element : elements) {
element = element.trim();
for (E type : EnumSet.allOf(clazz)) {
if (type.name().equalsIgnoreCase(element)) {
set.add(type);
break;
}
}
// ( Do we really want to ignore spurious values? )
}
return set;
}
(未经测试或编译。)
关于从字符串解析通用枚举集的 Java 静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959710/