Java静态方法从字符串解析泛型枚举集
我有很多类,它们定义了一些枚举,我希望从用户输入的字符串中加载这些枚举的值。因此,我发现自己在重复这个方法:Java静态方法从字符串解析泛型枚举集,java,generics,enums,set,Java,Generics,Enums,Set,我有很多类,它们定义了一些枚举,我希望从用户输入的字符串中加载这些枚举的值。因此,我发现自己在重复这个方法: 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.
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;
}
公共最终类状态{
公共静态枚举类型{慢速、快速、睡眠、停止、石头、隐形、愤怒、,
形态,出血,虚弱,哑,Sil,腐烂,Lev,笨拙};
公共静态集类型fromstring(String String){
EnumSet=EnumSet.noneOf(Status.TYPE.class);
if(字符串==null)
返回集;
String[]elements=String.split(“,”);
for(字符串元素:元素){
element=element.trim();
for(类型:EnumSet.allOf(Status.TYPE.class)){
if(type.toString().equalsIgnoreCase(元素)){
集合。添加(类型);
打破
}
}
}
返回集;
}
也就是说,给定一个字符串,该字符串包含与枚举项匹配的逗号分隔元素,返回一个用每个匹配项填充的集
我很想将此设置为泛型,这样我就不必维护它的十个不同副本,但我不太明白如何在返回一组枚举时将此设置为泛型。我认为它大致类似于以下方法:
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;
public static Set setFromString(String String,[要使用的枚举类]){
Set Set=EnumSet.noneOf([枚举类]);
if(字符串==null)
返回集;
for(字符串元素:String.split(“,”)){
element=element.trim().toLowerCase();
for([Element of Enum]类型:EnumSet.allOf([Class of Enum])){
if(type.toString().trim().toLowerCase().equals(元素))
集合。添加(类型);
}
}
}
返回集;
您需要指定泛型参数(是的,这就解决了问题。我想我需要复习一下我的泛型,因为我在阅读时了解到了它的要点,但我试图用签名公共静态集来定义它,这让Java很吃惊。谢谢。(另外,关于伪值的注释对后代来说是很好的。我还在我的用例中考虑它。)无关注释:枚举类型的代码约定是使用大写(即SLOW,HASTE,SLEEP,STOP…
而不是SLOW,HASTE,SLEEP,STOP…
)同意,但我也希望直接从这些值中显示,并且我不希望用户看到所有的大写字母。如果有任何方法可以同时兼顾这两个方面,我会洗耳恭听。然后这里:对枚举常量使用大写字母,然后使用set.add(enum.valueOf(myEnumClazz,element.toUpperCase())
,这也避免了循环。有预先构建的实用程序可以按名称获取枚举常量。您误解了——我希望以后能够调用状态的toString()
。键入
并按当前键入的方式显示结果。如果我将枚举项转换为大写,我将获得大写输出。
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;
}