2013-05-20 44 views
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關鍵字,那麼代碼中的組成在哪裏?

+5

它可能在'ForwardingSet'的定義中。 –

+0

哪個版本的Effective Java是這樣的?在第二版中,第18項是「優先接口到抽象類」。你在談論第16項嗎? –

+0

@vivin你是對的。這是一個錯字錯誤。我也更新了文字。 –

回答

0
public class ForwardingSet<E> implements Set<E> { 
    private final Set<E> s; 
         ^-- here is the private reference 

ForwardingSet通過將其所有方法轉發或委託給另一個Set來實現Set接口。這是裝飾者模式的行動。

1

基準是:

private final Set<E> s; 

S通過構造

ForwardingSet(Set<E> s) 

和孩子構造

InstrumentedSet(Set<E> s) 

調用超(S)設置;

InstrumentedSet是下層FowardingSet的包裝,並在那裏轉發呼叫。