抽象类和枚举

时间:2012-05-09 23:17:47

标签: java enums

我正在尝试建立一个抽象类。我想确保任何子类都有一个列出其潜在操作的枚举。

例如,Foo是一个抽象类。

Fee extends Foo and can...
    TALK
    WALK
    SLEEP

Bar extends Foo and can...
    SIT
    STARE

我想给父类提供字段,并让子类使用它能够执行的操作填充枚举。我该如何处理?

例如,如果我在类中定义枚举,给它一些通用动作,它是否会传递给子类并且子类可以扩展枚举吗?这可能是另一种选择。

2 个答案:

答案 0 :(得分:4)

我不知道我同意这种方法,但你可以做到

enum CanDos {
  TALK,
  WALK,
  SLEEP,
  SIT,
  STARE
}

然后课程可以

abstract class Foo {
  abstract Set<CanDos> getCanDos();
  //or
  abstract boolean can(CanDos item);
}

您可以使用EnumSet来有效存储功能。

如果您正在寻找的是提供一组枚举的正确的东西(比如您提到的父抽象类中的字段),那么我认为EnumSet<CanDos>是您的家伙。在那种情况下

abstract class Foo {

  private final Set<CanDos> candos;

  protected Foo(Set<CanDos> candos) 
  {
     this.candos = new EnumSet<CanDos>(candos);
  }

  public boolean can(CanDos item) {
    return candos.contains(item);
  }
}

或者你可以完全避免抽象类(或者至少不要求它看到例如this questionthis one)。备受好评的书 Effective Java 建议使用“Prefer interfaces to abstract classes”。

要做到这一点,而不是

enum CanDos {
  TALK,
  WALK,
  SLEEP,
  SIT,
  STARE
}

public interface FooThatCanDo {
  boolean can(CanDos item);
}

如果你真的认为公共继承根(你应该认真考虑)有价值,那么你可以提供一个如上所示的抽象基础实现,并声明它implements FooThatCanDo

答案 1 :(得分:0)

我认为枚举不是你想要的,至少不是直接的。也许你可以使用BitSet

class Base {
    private static EnumSet actions;

    public EnumSet getActions() { return actions; }
}

class Derived extends Base {
    private static EnumSet actions;

    @Override
    public EnumSet getActions() { 
        return new EnumSet(actions).addAll(super.getActions()); 
    }
}