如何理解构图和转发方法?

时间:2013-05-20 15:33:48

标签: java oop composition

在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关键字,那么代码中的组成在哪里?

2 个答案:

答案 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接口。这是装饰模式的实际应用。