【问题标题】:Java extendable enumerationJava 可扩展枚举
【发布时间】:2008-10-21 13:32:05
【问题描述】:

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

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

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

            public String getFieldName()
                {
                    return FieldName;
                }
        } 

【问题讨论】:

    标签: java design-patterns enums enumeration


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我认为这是最明智的设计吧?如果一个枚举实现了正确的接口,那么你就知道它是一个数据库字段的枚举。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-02-08
              • 2011-09-24
              • 2010-12-10
              • 2021-02-04
              • 1970-01-01
              • 2012-07-09
              相关资源
              最近更新 更多