任意Java枚举参数

时间:2009-03-27 10:16:54

标签: java enums

我对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);
   }
}

4 个答案:

答案 0 :(得分:9)

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

正如你所说,枚举在Java中有很大的不同。它们不是命名数字 - 它们是一组固定的值,但这些值是面向对象的(即它们可以使用多态性等)。除了关于初始化排序的一些棘手问题之外,Java还有很多不足之处。

答案 1 :(得分:2)

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

当然,仅仅定义一个枚举并且总是扩展其值不是一个选项,因为这显然违反了开放式原则。

对于这样一个用例,我对Josh Bloch的Typesafe Enum模式有相当好的经验,他在Effective Java中描述了

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

答案 2 :(得分:0)

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

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,
  }
}

答案 3 :(得分:0)

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

但是,您不能将一组枚举扩展到另一组。

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