Java可扩展枚举

有没有办法编写可以扩展的枚举。 我有几种方法可以随时提供给我的枚举。 例如,我对我的数据库字段使用枚举。 我在数据库中包含实际的字段名称。

public enum ORDERFIELDS { OrderID("Order_ID"); private String FieldName; private ORDERFIELDS(String fname) { this.FieldName = fname; } public String getFieldName() { return FieldName; } } 

如果我理解正确,你想做的是这样的:

 public abstract class DatabaseField { private String fieldName; private DatabaseField(String fieldName) { this.fieldName = fieldName; } public String getFieldName() { return fieldName; } } 

然后定义你的枚举来扩展这个类。 但是,遗憾的是枚举不能扩展一个类,但是它可以实现一个接口,所以你现在可以做的最好的事情是定义一个包含getFieldName()方法的接口,并让你所有的枚举实现这个接口。

但是,这意味着您必须在所有枚举中复制此方法(以及任何其他方法)的实现。 在这个问题中有一些关于如何最小化这种重复的建议。

所有枚举都隐式扩展了java.lang.Enum 。 由于Java不支持多重inheritance,因此枚举不能扩展其他任何内容。

枚举可以实现接口但不能扩展,因为编译时它们会转换为java.lang.Enum。

抽象枚举可能非常有用(目前不允许)。 但是,如果您想在Sun中为某人添加游戏来添加它,则会出现一个提案和原型:

http://freddy33.blogspot.com/2007/11/abstract-enum-ricky-carlson-way.html

Sun RFE:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6570766

对于Java前5天的回归,请看看Josh Bloch的第21章,第5章,Effective Java 。 他谈到通过添加值来扩展“枚举”,但也许您可以使用一些技术来添加新方法?

手工制作枚举的机制类似于Josh Bloch的Effective Java中定义的机制。

我想补充一点,如果你需要“扩展”枚举,那么枚举可能不是你所追求的构造。 它们是静态常量恕我直言。