【问题标题】:Arbitrary Java enum argument任意 Java 枚举参数
【发布时间】:2009-03-27 19:22:01
【问题描述】:

我对 java 还很陌生,并且习惯于枚举本质上只不过是一个命名的整数列表。

现在我正在编写一个实现,其中父类有几个将枚举值作为参数的方法。枚举将在子类中定义,并且会略有不同。由于枚举基本上看起来像类,这并不像我预期的那样工作。每个定义的枚举都将被视为不同类型的对象,父类必须选择一个已定义的枚举作为参数。

有没有一种好方法可以让父类接受在其子类中定义的任何枚举?还是我必须为此编写一个自定义类?

编辑:这是我的示例,根据 Jon Skeets 的回答修复,适用于稍后研究如何执行此操作的任何人:

class Parent {
   protected interface ParentEvent {}
   private HashMap<ParentEvent, String> actions = new HashMap<ParentEvent, String>();

   protected void doStuff(ParentEvent e){

      if(actions.containsKey(e)){
         System.out.println(actions.get(e));
      }

   }
}

class Child extends Parent {
   enum Event implements ParentEvent {EDITED, ADDED, REMOVED}

   public void trigger(){
      doStuff(Event.REMOVED);
   }
}

【问题讨论】:

  • 我真的不明白你想要做什么(或为什么)。你能详细说明吗?也许让例子更具体?

标签: java enums


【解决方案1】:

你可以让你的枚举实现一个接口,然后给你的父类方法一个该接口类型的参数。

正如您所说,枚举在 Java 中是完全不同的。它们不是命名数字——它们是一组固定的值,但这些值是面向对象的(即它们可以使用多态等)。 Java 枚举几乎是摇滚,除了一些关于初始化排序的棘手问题。

【讨论】:

  • 唯一不完全摇滚的是你不能“扩展”枚举(例如,有一个父枚举,具有一组给定的常量,并派生它以添加更多常量.. .) 我实现了一个版本,所以它是可行的,但不幸的是不是标准工具箱的一部分:(
  • @Varkhan - 我意识到这已经过时了,但我现在偶然发现了它。有什么方法可以让我看看您为可扩展枚举所做的工作?
【解决方案2】:

如果我对您的理解正确,您希望为您的枚举提供一个通用基类,并希望为子类定义几个不相关的枚举集。这对于 java 的类型安全枚举是不可能的,因为它们不允许您定义基类。

当然,仅定义一个枚举并始终扩展其值不是一种选择,因为这显然违反了打开关闭原则。

对于这样的用例,我对 Josh Bloch 在 Effective Java 中描述的类型安全枚举模式有相当好的经验

只需在此处介绍您的超类,并为您的客户端类所需的每个枚举值创建不同的子类。

【讨论】:

    【解决方案3】:

    我不确定,但也许这就是你想要的:

    public abstract class EnumTest<E extends Enum<E>> {
      public abstract void frobnicate(E value);
    }
    
    public class Derived extends EnumTest<Derived.DerivedEnum> {
      public void frobnicate(DerivedEnum value) {
        System.out.println(value);
      }
    
      public static enum DerivedEnum {
        FOO, BAR,
      }
    }
    

    【讨论】:

      【解决方案4】:

      如果枚举适用于不同的类,您可以在它们自己的文件中定义它们。它们不需要嵌套在一个类中。

      您不能从另一组扩展一组枚举。

      我花了一段时间才摆脱枚举“只是一个整数”的心态。

      【讨论】:

        猜你喜欢
        • 2018-03-20
        • 2010-09-16
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 2014-07-05
        相关资源
        最近更新 更多