Java 如何将字符串转换为正确的枚举常量(实现公共接口的多个枚举)?
假设我有一个接口Java 如何将字符串转换为正确的枚举常量(实现公共接口的多个枚举)?,java,interface,enums,type-conversion,Java,Interface,Enums,Type Conversion,假设我有一个接口 public interface Feature { public abstract void doSmth(); } 。。。以及实现该接口的多个枚举: //第一个枚举 public enum FeatureA implements Feature { A1 { @Override public void doSmth() { System.out.println("A ==== A1"); } }, A2 {
public interface Feature
{
public abstract void doSmth();
}
。。。以及实现该接口的多个枚举:
//第一个枚举
public enum FeatureA implements Feature
{
A1
{
@Override public void doSmth() { System.out.println("A ==== A1"); }
},
A2
{
@Override public void doSmth() { System.out.println("A ==== A2"); }
};
@Override public abstract void doSmth();
}
//第二枚举
public enum FeatureB implements Feature
{
B1
{
@Override public void doSmth() { System.out.println("B ==== B1"); }
},
B2
{
@Override public void doSmth() { System.out.println("B ==== B2"); }
},
B3
{
@Override public void doSmth() { System.out.println("B ==== B3"); }
};
@Override public abstract void doSmth();
}
//以及许多其他实现该特性的枚举
现在假设我组装了一组字符串,这些字符串与枚举常量的名称相对应,如下所示(这对于第三方代码是必需的)
但是,如果集合中的字符串对应于不同的枚举常量呢?例如:
Set<String> multipleEnums = new LinkedHashSet<String>();
multipleEnums.add("A1");
multipleEnums.add("B2");
multipleEnums.add("A2");
有没有一个简单的方法?Eclipse允许应用于Feature的唯一方法是Feature.class,我真的不知道如何从这里开始。
我处理的是巨大的数据集,所以性能很重要
谢谢。您可以使用每个枚举的名称创建一个映射
static final Map<String, Feature> map = ...
static <F extends Enum & Feature> void addEnums(F... features) {
for(F f: features)
map.put(f.name(), f);
}
addEnums(FeatureA.values());
addEnums(FeatureB.values());
静态最终映射=。。。
静态无效补遗(F…特征){
用于(F:功能)
map.put(f.name(),f);
}
附录(FeatureA.values());
附录(FeatureB.values());
有没有一个简单的方法
我不这么认为。如果只是一个枚举,则可以使用枚举的静态valueOf
方法进行转换。但是对于多个枚举,您需要调用它们中的每一个。。。并处理非法辩论的例外情况
我认为您将不得不为所有枚举值创建并填充一个
映射。这与我在当前项目中的做法差不多,我正好有这个要求。不过有一点:我对映射使用了惰性初始化习惯用法,因为否则必须显式调用addEnums
,或者在静态初始值设定项中执行,这可能会导致循环依赖性问题。
Set<String> multipleEnums = new LinkedHashSet<String>();
multipleEnums.add("A1");
multipleEnums.add("B2");
multipleEnums.add("A2");
for (String s : multipleEnums)
{
Feature./* convert s to the correct enum */.doSmth();
}
static final Map<String, Feature> map = ...
static <F extends Enum & Feature> void addEnums(F... features) {
for(F f: features)
map.put(f.name(), f);
}
addEnums(FeatureA.values());
addEnums(FeatureB.values());