Java可扩展枚举
问题描述:
有没有办法写一个可以扩展的枚举。我有几种方法,我希望可以随时获得我的枚举。例如,我为我的数据库字段使用枚举。我将实际的字段名称包含在数据库中。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()方法的接口,并让所有的枚举实现这个接口。
但是,这意味着您必须在所有枚举中重复执行此方法(以及任何其他方法)。在this question中有一些建议可以减少这种重复。
答
所有枚举都隐式扩展java.lang.Enum
。由于Java不支持多重继承,因此枚举不能扩展其他任何东西。
答
枚举可以实现接口,但不能扩展,因为编译它们时会转换为java.lang.Enum。
答
回到Java之前的5天,看看Item 21, Chapter 5,Effective Java by Josh Bloch。他谈到通过增加值来扩展“枚举”,但也许你可以使用一些技术来添加新的方法?
答
抽象枚举可能非常有用(当前不允许)。但提议和原型存在,如果你想游说有人在太阳将其添加:
http://freddy33.blogspot.com/2007/11/abstract-enum-ricky-carlson-way.html
孙RFE:
答
手工工艺类似的机制枚举在Josh Bloch的Effective Java中定义。
我会补充说,如果您需要“扩展”枚举,那么也许枚举不是您在之后的构造。他们的意思是静态常量恕我直言。
我认为这是最明智的设计在这里吧?如果一个枚举实现了正确的接口,那么你知道它是一个数据库字段的枚举。 – 2008-10-21 13:45:30