0

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

4

2 回答 2

1

参考在:

private final Set<E> s;

s 通过构造函数设置

ForwardingSet(Set<E> s) 

和子构造函数

InstrumentedSet(Set<E> s)  

调用super(s);

InstrumentedSet 是底层 FowardingSet 的包装器,并将调用转发到那里。

于 2013-05-20T16:05:07.130 回答
0
public class ForwardingSet<E> implements Set<E> {
    private final Set<E> s;
                         ^-- here is the private reference

ForwardingSet 通过将其所有方法转发或委托给另一个 Set 来实现 Set 接口。这是实际的装饰器模式。

于 2013-05-20T16:02:47.003 回答