任意的Java枚举参数

3

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

我真的不太明白你想做什么(或者为什么要这样做)。你能详细解释一下吗?也许可以举一个更具体的例子来说明吗? - undefined
4个回答

10
你可以让你的枚举实现一个接口,然后给你的父类方法传递该接口类型的参数。
正如你所说,Java中的枚举有些不同。它们不是命名数字 - 它们是一组固定的值,但这些值是面向对象的(即它们可以使用多态等)。Java枚举基本上很棒,除了一些关于初始化顺序的棘手问题。

1
唯一不太理想的是你不能“扩展”枚举(比如说,有一个父枚举,带有一组给定的常量,然后派生出来添加更多常量...)我实现了一个版本,所以是可行的,但不幸的是它不是标准工具箱的一部分 :( - undefined
@Varkhan - 我意识到这已经过时了,但我现在刚刚碰巧发现它。有没有办法让我看看你对可扩展枚举做了什么? - undefined

2
如果我理解你的意思正确,你想要为枚举定义一个公共基类,并想要为子类定义几个不相关的枚举集。然而,使用Java的类型安全枚举是不可能实现的,因为它们不允许你定义一个基类。
当然,只定义一个枚举并始终扩展其值也不是一个选择,因为这显然违反了开放封闭原则。
对于这样的用例,我在Josh Bloch所描述的Effective Java中使用过类型安全枚举模式,效果还不错。
只需在此引入您的超类,并为客户端类需要的每个枚举值创建不同的子类即可。

0
你可以将枚举定义在它们自己的文件中,如果它们适用于不同的类。它们不需要嵌套在一个类中。
但是,你不能从另一个枚举集合扩展一个枚举。
我花了一些时间才摆脱“枚举只是一个整数”的思维方式。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接