假设我有一个格式为基本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 票数:17 已采纳

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

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可以解析为新实例化的Salutation对象,这些对象可以存储在某个Collection ,也可以由程序使用。 请注意,在我的示例中,我通过赋予它一个private构造函数来限制Salutation的创建 - 在这种情况下,检索实例的唯一方法是调用带有XML的工厂方法。 我相信这可以实现您正在寻找的行为。

===============>>#2 票数:8

其实这可以动态创建枚举实例,但它是一个总劈,我不会建议它在所有-也许你误解的性质enum ,它是语言的编译时的功能,而你不应该在运行时添加/删除实例。

无论如何,如果你对动态创建枚举实例的hack感兴趣,请看一下这篇文章

===============>>#3 票数:1

同意奥斯卡洛佩兹。 这就是我所做的,一种破解。

public static enum Setter {

    DYNAMIC_ENUM_EXAMPLE {

        @Override
        public String setGetValue(String yourValue) {
            return "prefix " + yourValue + " postfix";
        }
    };
    public abstract String setGetValue(String value);
}

你可以得到这样的价值:

Setter.DYNAMIC_ENUM_EXAMPLE.setGetValue("namaste")

输出:

prefix namaste postfix

===============>>#4 票数:1

动态枚举是您的问题的答案:

public abstract class DEnum<E extends DEnum<E>> implements Comparable<E>, Serializable {

该类具有类似于标准Enum类的签名。 它有一个受保护的构造函数,允许在具体的Enum类中创建实例。 例如:

public class YesNo extends DEnum<YesNo> {

    public final static YesNo YES = new YesNo();
    public final static YesNo NO = new YesNo();

DEnum类通过内省知道成员的名称:

String name = YesNo.YES.getName();
YesNo yes = YesNo.get(YesNo.class, name);
assert (yes == YesNo.YES);

有一个类型的getter可以检索所有项目:

YesNo[] items = yes.getItems();
assert (items.length == 2);

它允许在运行时使用(从数据库或从文件)动态添加成员:

YesNo maybe = getOrCreateIfNotExists(YesNo.class, "MAYBE");
items = yes.getItems();
assert (items.length == 3);

其中与静态成员具有相同的行为:

YesNo unknown = YesNo.get(YesNo.class, "MAYBE");
assert (unknown == maybe);

  ask by Chris Cashwell translate from so

未解决问题?本站智能推荐:

2回复

无法使用带有方法的枚举的动态类参数实例化EnumMap

我偶然发现了Java中没有任何定义方法的枚举与执行以下操作的枚举之间的行为上的奇怪差异:在后一种情况下, Enum.class和Enum.getClass()实际上引用了不同的编译类,即!Enum.class.equals(Enum.getClass()) ; 尝试使用仅在运行时指定的类实例化
2回复

什么时候计算枚举变量中的函数?

考虑以下代码: 代码将如何表现? 该方法是在编译时直接计算并固定的,还是在有人通过MyOwnEnum.FEVRIER或MyOwnEnum.valueOf("FEVRIER")调用FEVRIER时计算? 还是固定的,但是在运行时?
1回复

JVM可以在运行时优化不变的枚举方法吗?

JVM可以在以下场景中执行运行时优化吗? 我们有以下情况,我们有这个界面: 并具体实施如下: 请问JVM能够找出(在运行时),一个枚举实例如TestResources.TR1属于一个ResourceRetriever像ResourceRetriever.forResourc
5回复

你可以在java枚举中拥有的成员数量限制是多少?

假设你在这样的java中有一个假设的枚举(纯粹用于演示目的,这不是我非常期待使用的代码): 在编译器停止之前,你可以在枚举中拥有的最大成员数是多少? 其次,当您的代码引用枚举时,运行时是否有任何性能差异,例如10个成员而不是100或1,000(除了存储大型类所需的明显内存开销)?
2回复

使用反射创建枚举

C#是否提供了一种使用反射从头开始创建Enum类型的方法? 假设,我有一个strings集合: {"Single", "Married", "Divorced"}我愿意在运行时构建以下枚举类型: 这有点可能吗?
1回复

在运行时输入枚举

我有一个方法GenerateOutput打印一个字符串列表。 该方法将多个枚举作为参数,并根据将哪些标志输入该方法来输出结果。 我知道枚举是为编译时设计的,但是否可以根据用户在程序中选择的选项在运行时更改输出? 本质上,我有各种复选框,它们代表可能的枚举。 当用户选择一个选项时,该标志应
3回复

通过LINQ获取枚举的最大值,并且仅给出枚举类型

我知道如何获取枚举的最大值在这里有一个答案: 获取枚举的最大值 。 我的问题是不同的:我需要编写一个仅将枚举Type作为参数的函数GetMax ,并且我需要获取枚举的最大值。 同时,我的枚举可能来自long或int 。 为避免溢出,返回的最大值应为数字long 。 这是函数声明:
3回复

在C#中设置运行时的枚举值

有什么办法可以在运行时更改enum值吗? 例如,我有以下类型 我想在运行时将set 5设置为TypeOne ,将3设置为TypeTwo 。
1回复

获取只有字符串的嵌套枚举的类型?

我正在尝试做的是获取嵌套在Class中的enum Type , Class仅具有该枚举数的名称作为字符串。 例: 我需要得到 有没有办法在运行时获取此Type ? 提前致谢:)
2回复

在运行时有条件地声明一个枚举(C ++)

我遇到了一些与运行时检测有关的有趣发现,这些发现引发了一个有趣的问题。 如果要基于条件声明全局变量,则可以在#ifdefs预编译过程中轻松地声明。 但是,这会产生不同的二进制文件,我正在寻找一种可以在运行时实现的解决方案,以将行为限制为单个二进制文件。 例 我可以对数组或其他数据