Java可扩展枚举

时间:2008-10-21 13:32:06

标签: java design-patterns enums enumeration

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

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

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

            public String getFieldName()
                {
                    return FieldName;
                }
        } 

6 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:10)

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

public abstract class DatabaseField {
    private String fieldName;

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

    public String getFieldName() {
        return fieldName;
    }
}

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:6)

抽象枚举可能非常有用(目前不允许)。但是如果你想在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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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