我想创建类似于可扩展Enum的东西(理解Java 6中不可能扩展Enums)。

这是我想做的事情:
我有许多“模型”类,并且每个这些类都有一组与之关联的字段。这些字段用于索引包含数据表示形式的地图。

我需要能够从类OR实例obj访问字段,如下所示:

MyModel.Fields.SOME_FIELD #=> has string value of "diff-from-field-name"


要么

myModel.Fields.SOME_FIELD #=> has string value of "diff-from-field-name"


我还需要能够获得模型的所有字段的列表

MyModel.Fields.getKeys() #=> List<String> of all the string values ("diff-from-field name")


为每个模型定义“字段”类时,我希望能够将定义与模型保存在同一文件中。

public class MyModel {
    public static final Fields extends BaseFields {
        public static final String SOME_FIELD = "diff-from-field-name";
        public static final String FOO = "bar";
    }

    public Fields Fields = new Fields();

    // Implement MyModel logic
}


我也想让OtherModel扩展MyModel并能够从MyModel.Fields继承Fields,然后在它上面添加自己的Fields。

public class OtherModel extends MyModel {
   public static final class Fields extends MyModel.Fields {
        public static final String CAT = "feline";
        ....


哪个可以允许

OtherModel.Fields.CAT #=> feline
OtherModel.Fields.SOME_FIELD #=> diff-from-field-name
OtherModel.Fields.FOO #=> bar
OtherModel.Fields.getKeys() #=> 3 ["feline", "diff-from-field-name", "bar"]


我试图使模型中“字段”的定义尽可能简洁明了,因为各种开发人员都将构建这些“模型”对象。

谢谢

最佳答案

我需要能够从类OR实例obj访问字段,如下所示:


  MyModel.Fields.SOME_FIELD #=> has string value of "diff-from-field-name"


除非您使用真实的enumSOME_FIELD是真实的字段,否则在Java中这是不可能的。无论哪种情况,“枚举”都是不可扩展的。

在Java 6中,您可以做的最好的事情就是将枚举建模为从字符串名称到int值的映射。这是可扩展的,但是从名称到值的映射会导致运行时开销……以及您的代码将使用不是枚举成员的名称的可能性。



Java中的enum类型不可扩展的原因是,扩展的enum会破坏原始enum的隐式不变式,并且(因此)不能被替代。

08-06 04:34
查看更多