java - 抽象类和枚举

标签 java enums

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

例如,Foo 是一个抽象类。

Fee extends Foo and can...
    TALK
    WALK
    SLEEP

Bar extends Foo and can...
    SIT
    STARE

我想给父类一个字段,让子类用它能够执行的操作填充枚举。我将如何处理这个问题?

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

最佳答案

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

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

如果您真的认为公共(public)继承根具有值(value)(您应该仔细考虑一下),那么您可以提供如上所示的抽象基础实现,并声明它 implements FooThatCanDo .

关于java - 抽象类和枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525466/

相关文章:

exception - 枚举在 Groovy 2.x 中导致 ExceptionInInitializerError

使用枚举的 C# 事件处理程序

java - @NamedStoredProcedureQuery 不适用于 Hibernate 5.1.x 和 JPA2.1

java - Tomcat 管理器未显示嵌入式版本

java - 在静态 try-catch 中分配静态最终变量

c# - 还有另一种测试枚举位域的方法吗?

typescript - typescript 中枚举的通用函数

Java Swing 默认聚焦于框架

Java org.w3c.dom : is there a Java parser library?

java - 比较枚举值