直接或间接代表(通过抽象方法)?

时间:2014-11-02 04:08:18

标签: java collections delegates

直接或间接委派(通过抽象方法)是否有优势? (我直接编造了条款"""间接&#34 ;;我不知道这些是否正确。)

以Google Guava' ForwardingList为例。

Google选择通过抽象方法间接实施授权。

public abstract class ForwardingList<T>
extends List<T> {

    protected ForwardingList() { }

    protected abstract List<T> delegate();

    @Override
    public int size() {
        return delegate().size();
    }

}

或者,可以通过接受List作为构造函数参数来实现此类。

public abstract class ForwardingList<T>
extends List<T> {

    private final List<T> list;

    protected ForwardingList(List<T> list) {
        this.list = list;
    }

    @Override
    public int size() {
        return list.size();
    }

}

再说一次是否有优势?如果可能,请提供一个简单的用例,以选择直接或间接授权。

1 个答案:

答案 0 :(得分:1)

“间接授权”比“直接授权”更普遍/更少限制。假设您正在编写扩展ForwardingList的A类。如果你使用直接委托,那么你需要将列表的实例传递给A的构造函数。现在,如果基础列表的构造是非常昂贵的操作,并且对A.size()的调用并不总是由A的用户可能想要懒惰地初始化基础列表以提高性能。那就是“间接授权”变得有用的时候。