2011-12-11 87 views
12

比方说,我有它的格式是基本的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。我可以如何实现这样的事情?它可行吗?

回答

14

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

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的工厂方法。我相信这会实现你正在寻找的行为。

+0

有道理。我特意问了关于枚举的原因,因为我的层次结构现在有太多(不是一个荒谬的数量,只有几个),我希望能够消除它们。 –

+0

@Chris - 等等,你的代码生成问题,或者是在运行时创建它们的问题? –

+0

真的,它是关于在运行时创建它们的。我想这是不同的。 –

6

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

无论如何,如果您对动态创建枚举实例的破解感兴趣,请看看这个article

0

同意奥斯卡洛佩兹。这是我做的,一种黑客。

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 
0

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

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

这个类有一个类似于标准Enu的签名米类。它有一个受保护的构造函数,允许在具体的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); 
+0

你应该包含一个到'DEnum'实现的链接,或者在这里发布 –