2008-10-21 156 views
7

有没有办法写一个可以扩展的枚举。我有几种方法,我希望可以随时获得我的枚举。例如,我为我的数据库字段使用枚举。我将实际的字段名称包含在数据库中。Java可扩展枚举

public enum ORDERFIELDS 
     { 
      OrderID("Order_ID"); 
      private String FieldName; 

      private ORDERFIELDS(String fname) 
       { 
        this.FieldName = fname; 
       } 

      public String getFieldName() 
       { 
        return FieldName; 
       } 
     } 

回答

10

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

public abstract class DatabaseField { 
    private String fieldName; 

    private DatabaseField(String fieldName) { 
     this.fieldName = fieldName; 
    } 

    public String getFieldName() { 
     return fieldName; 
    } 
} 

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

但是,这意味着您必须在所有枚举中重复执行此方法(以及任何其他方法)。在this question中有一些建议可以减少这种重复。

16

所有枚举都隐式扩展java.lang.Enum。由于Java不支持多重继承,因此枚举不能扩展其他任何东西。

6

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

+0

我认为这是最明智的设计在这里吧?如果一个枚举实现了正确的接口,那么你知道它是一个数据库字段的枚举。 – 2008-10-21 13:45:30

0

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

我会补充说,如果您需要“扩展”枚举,那么也许枚举不是您在之后的构造。他们的意思是静态常量恕我直言。