好的,我打算在这里扩充我的评论。
如果您希望您的getBehaviors()
方法返回的行为列表于特定动物,制作方法签名声明,则返回List<Enum<?>>
不什么来帮助你。从该方法获得List<Enum<?>>
的客户无法做任何有用的事情(谁知道它是什么?)。限制也不会做任何事情来帮助确保行为列表中包含的对象的类型实际上是“行为”,无论在应用程序的上下文中如何。他们可能是一周中的几天,一年中的几个月或几乎任何事情!
什么我猜是,你有一些enum
就像DogBehavior
(与常量像BARK
,BITE
等),要确保只有这些行为被允许在列表中。这些行为在enum
中收集的事实是一个实现细节。你应该做的是引入一个通用接口,指定某种东西为Behavior
。如果没有任何与Behavior
相关的特定方法,它可能只是一个标记接口(不定义任何方法)。否则,你可能希望它有一些方法,像这样:
public interface Behavior {
public String getName();
public void doBehavior();
// etc.
}
然后,您可以有一些enum
s表示实现这个接口:
public enum DogBehavior implements Behavior {
BARK("Bark") {
public void doBehavior() {
// bark
}
},
// etc.
private final String name;
DogBehavior(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
那么,“动物”可能看起来像:
public abstract class Animal {
public abstract List<Behavior> getBehaviors();
}
这对我来说更有意义。
你为什么要这么做?某些东西是`enum`通常应该至多是一个实现细节。如果你想让你的`Animal`类返回一个行为列表,我会说它应该返回`List`,其中`Behavior`是一个接口。你可以有一些`enum`或者`enum`来实现`Behavior`,但是这个细节看起来并不重要。并且对行为列表包含的唯一限制是它包含的对象是某种“enum”对我来说没有意义......“DayOfWeek”可能不是行为。 –
ColinD
2011-01-19 23:02:47