我正在尝试建立一个抽象类。我想确保任何子类都有一个枚举,列出它的潜在操作。
例如,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 question 或 this 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/