java - 如何将 String 转换为正确的 Enum 常量(实现公共(public)接口(interface)的多个 Enum)?

标签 java interface enums type-conversion

假设我有一个界面...

public interface Feature
{
    public abstract void doSmth();
}

...和实现该接口(interface)的多个枚举:

//第一个枚举

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> singleEnum = new LinkedHashSet<String>();
singleEnum.add("A2");
singleEnum.add("A1");

...稍后我需要将此类集合中的每个字符串转换为枚举常量,然后应用 doSmth() 方法。 singleEnum 仅包含 FeatureA 常量的名称,因此我可以在这种情况下应用 valueOf(String) 方法:

for (String s : singleEnum)
{
    FeatureA.valueOf(s).doSmth();
}

但是如果集合中的字符串对应于不同的枚举常量呢?例如:

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

有没有简单的方法来做到这一点? Eclipse 允许应用于 Feature 的唯一方法是 Feature.class,我真的不知道如何从那里开始。 我正在处理庞大的数据集,因此性能很重要。

谢谢。

最佳答案

您可以使用每个枚举的名称创建一个 Map

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

关于java - 如何将 String 转换为正确的 Enum 常量(实现公共(public)接口(interface)的多个 Enum)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914621/

相关文章:

java - 如何关闭 Windows 7 中打开的端口?

Java 8 默认方法继承

c# - 如何从 C# 中的未知枚举中获取值?

java - 在 Java 中定义错误代码/字符串的最佳方法?

java - 在这里使用的正确随机算法是什么?

java - 如何在 java 中组合具有相同属性值的对象的 2 个数组列表

java - 在序列化我的对象时,如何强制 Jackson 将数字写成字符串

c# - 如何创建具有可变参数/不同方法签名的方法接口(interface)?

interface - Mongodb - 当属性具有 Interface 返回类型时如何反序列化

java - 如何将一些或多个对象附加到枚举?