7

有没有办法编写一个可以扩展的枚举。我有几种方法我希望始终可用于我的枚举。例如,我对我的数据库字段使用枚举。我在数据库中包含了实际的字段名称。

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

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

            public String getFieldName()
                {
                    return FieldName;
                }
        } 
4

6 回答 6

16

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

于 2008-10-21T13:35:42.263 回答
10

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

public abstract class DatabaseField {
    private String fieldName;

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

    public String getFieldName() {
        return fieldName;
    }
}

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

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

于 2008-10-21T13:38:54.393 回答
6

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

于 2008-10-21T13:40:01.287 回答
6

抽象枚举可能非常有用(目前不允许)。但是,如果您想游说 Sun 中的某个人添加它,那么存在一个提案和原型:

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

太阳 RFE:

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

于 2008-10-21T19:59:23.517 回答
0

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

于 2008-10-21T14:22:55.973 回答
0

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

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

于 2008-10-22T03:33:27.250 回答