在Java第16项中有效:
幸运的是,有一种方法可以避免以前出现的所有问题。不要扩展现有的类,而是为新类提供引用现有类的私有字段。
然后我得到了详细解释的代码:
public class InstrumentedSet<E> extends FowardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> s) {
super(s);
}
public boolean add(E e) {
addCount++;
super.add(e);
}
...
public int getCount() {
return addCount;
}
}
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) {
this.s = s;
}
public boolean add(E e) {
return s.add(e);
}
...
}
我感到困惑:私人参考在哪里?我明显看到了extends关键字,那么代码中的组成在哪里?
答案 0 :(得分:1)
参考文献位于:
private final Set<E> s;
是通过构造函数
设置的ForwardingSet(Set<E> s)
和子构造函数
InstrumentedSet(Set<E> s)
调用super(s);
InstrumentedSet是底层FowardingSet的包装器,并在那里转发调用。
答案 1 :(得分:0)
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
^-- here is the private reference
ForwardingSet通过将其所有方法转发或委托给另一个Set来实现Set接口。这是装饰模式的实际应用。