我已阅读有效Java的第16项和 Prefer composition over inheritance?现在尝试将它应用于1年前编写的代码,当时我已经开始了解Java。
我正在试图塑造一种可以具有特征的动物,即游泳,肉食等,并获得不同类型的食物。
public class Animal {
private final List<Trait> traits = new ArrayList<Trait>();
private final List<Food> eatenFood = new ArrayList<Food>();
}
在第16项中,建议使用组合和转发可重复使用的方法:
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) {this.s = s;}
//implement all interface methods
public void clear() {s.clear();}
//and so on
}
public class InstrumentedSet<E> extends ForwardingSet<E> {
//counter for how many elements have been added since set was created
}
我可以实现ForwardingList<E>
,但我不确定如何将它应用于Animal
类两次。现在Animal
我有traits
以及eatenFood
等多种方法。这对我来说似乎很尴尬。
public boolean addTrait (Trait trait) {
return traits.add(trait);
}
public boolean removeTrait (Trait trait) {
return traits.remove(trait);
}
您如何重新设计Animal
课程?
我应该保持原样还是尝试申请ForwardingList
?
答案 0 :(得分:1)
没有理由要为此问题专门设置列表。你已经在这里使用了Composition,它几乎就是我对课程的期望。
组合基本上是创建一个具有一个(或通常更多)成员的类。转发实际上是让你的方法只是调用它所拥有的一个对象来处理它。这正是您已经在做的事情。
无论如何,你提到的方法正是我期望的一个具有特征的类的方法。我期待类似的addFood / removeFood食物方法。如果他们出错,他们就会出现几乎每个人都做错的确切错误。