我想创建类似于可扩展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"
除非您使用真实的
enum
或SOME_FIELD
是真实的字段,否则在Java中这是不可能的。无论哪种情况,“枚举”都是不可扩展的。在Java 6中,您可以做的最好的事情就是将枚举建模为从字符串名称到
int
值的映射。这是可扩展的,但是从名称到值的映射会导致运行时开销……以及您的代码将使用不是枚举成员的名称的可能性。Java中的
enum
类型不可扩展的原因是,扩展的enum
会破坏原始enum
的隐式不变式,并且(因此)不能被替代。