阅读 Effective Java , 我从 Item 16: Favor composition over inheritance
中看到了以下示例。
在下面的 InstrumentedSet
中,书中显示我们可以跟踪元素被插入的次数(通过 InstrumentedSet.addCount
变量)。
为此,我们可以简单地附加到此类对象的 addCount
,然后调用 ForwardingSet.add()
,它会调用实际的 Set
类的 add()
的实际实现。
// Reusable forwarding class
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) { this.s = s; }
public void clear() { s.clear(); }
public boolean contains(Object o) { return s.contains(o); }
...
}
// Wrapper class - uses composition in place of inheritance
public class InstrumentedSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> s) { super(s); }
@Override public boolean add(E e) {
addCount++;
return super.add(e);
}
...
}
我的理解是否正确,要使用此模式/方法,Forwarding*
类必须调用其父类的所有 方法(在本例中设置
)?
最佳答案
是的,您是对的,ForwardingSet
委托(delegate)/转发它对支持集的所有调用。
您可能想看看流行库 Guava 中的工作示例:ForwardingMap .
关于java - 转发类示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151598/