动态生成枚举

2022-09-01 22:42:48

假设我有一个文件格式为基本 XML 的文件,如下所示:

<?xml version="1.0"?>
<enum-set>
    <enum>
        <name>SomeEnum</name>
        <values>
            <value>
                <name>SOMEVALUE</name>
                <displayText>This is some value</displayText>
             </value>
            ... more values ...
        </values>
    </enum>
    ... more enums ...
</enum-set>

我想在运行时变成这样的东西:SomeEnum

public enum SomeEnum implements HasDisplayText {
    SOMEVALUE("This is some value"),
    ... more values ...;

    private String displayText;

    SomeEnum(String displayText) {
        this.displayText = displayText;
    }

    @Override
    public String getDisplayText() {
        return displayText;
    }
}

...然后将新创建的枚举传递到我的应用程序周围。我怎样才能实现这样的事情?可行吗?SomeEnum


答案 1

你想做的事情并没有多大意义。枚举实际上只是为了编译时的好处,因为它们表示一组固定的常量。在运行时,动态生成的枚举的含义是什么 - 这与普通对象有何不同?例如:

public class Salutation implements HasDisplayText {

   private String displayText;

   private Salutation(String displayText) {
       this.displayText = displayText;
   }

   @Override
   public String getDisplayText() {
       return displayText;
   }

   public static Collection<Salutation> loadSalutations(String xml) {
      //parse, instantiate, and return Salutations
   }
}

可以将 XML 解析为新实例化的对象,这些对象可以存储在某些对象中,也可以由程序以其他方式使用。请注意,在我的示例中,我通过为其提供构造函数来限制它的创建 - 在这种情况下,检索实例的唯一方法是调用采用 XML 的工厂方法。我相信这可以实现您正在寻找的行为。SalutationCollectionSalutationprivate


答案 2

实际上,动态创建枚举实例可能的,但这是一个完全的黑客攻击,我根本不建议它 - 也许你误解了,它是该语言的编译时功能,你不应该在运行时添加/删除实例。enum

无论如何,如果您对动态创建枚举实例的技巧感兴趣,请查看本文