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());