直接或间接委托(抽象方法)?

直接或间接委托(抽象方法)?

问题描述:

直接或间接授权(通过抽象方法)有优势吗? (我编造了术语“直接”和“间接”;我不知道这些是否正确)。直接或间接委托(抽象方法)?

以Google Guava的ForwardingList为例。

谷歌选择通过抽象方法间接实施代表团。

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(); 
    } 

} 

再说一遍:是否有一个优于另一个?如果可能的话,请提供一个简单的用例来优先直接或间接授权。

+0

看起来就像是[Double dispatch](http://en.wikipedia.org/wiki/Double_dispatch)在行动中的一个例子。 – 2014-11-02 04:15:43

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

+0

好点;谢谢。 – kevinarpe 2014-11-02 04:54:08