[英]Definition of a constant field in Bloch's Effective Java 2nd edition
[英]Effective Java item 16 (2nd edition) - Is Forwarding class only used to allow re-use?
我正在通過Effective Java, Item-16 Favor composition over inheritance
。 我查看了下面的Forwarding class
示例。
我想知道有一個ForwardingSet
類是什么意思? InstrumentedSet
可以很好地實現Set
並擁有一個調用所有方法的私有實例。
是否可以促進重用並防止冗余,如果我們最終在將來需要除了基本行為之外還需要做一些類型的InstrumentedSet
? 它只是面向未來的設計,還是我缺少的其他東西?
// Reusable forwarding class
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) { this.s = s; }
public void clear() { s.clear(); }
public boolean contains(Object o) { return s.contains(o); }
...
}
// Wrapper class - uses composition in place of inheritance
public class InstrumentedSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> s) { super(s); }
@Override public boolean add(E e) {
addCount++;
return super.add(e);
}
...
}
ForwardingSet
是一個框架。 如果你有寫一些Set
,與其他加工對象物S Set
小號內部的“香草”的頂部,但提供不同的功能Set
,你最好幾次寫的共同部分一次不行。
有效Java中的 Joshua Bloch將其稱為“組合”,盡管實際實現看起來更像裝飾器模式 。
作為名為ForwardingSet
的類, Guava中可以使用實際的實現。
是否可以促進重用並防止冗余,如果我們最終在將來需要除了基本行為之外還需要做一些類型的InstrumentedSet?
是。
它只是面向未來的設計嗎?
是。
還是我還缺少其他的東西?
不,你沒有遺漏任何東西。
是促進重復使用並防止冗余嗎? 是。
它只是面向未來的設計嗎? 是。
我還缺少其他東西嗎? 沒有。
“轉發”通常被稱為“ 委托 ”。
請參閱: 委派模式的目的是什么?
具有委托實現的Java類的一些示例:
java.io.FilterInputStream
(和java.io.FilterOutputStream
, java.io.FilterReader
, java.io.FilterWriter
)
FilterInputStream
類本身簡單地覆蓋了InputStream
所有方法,其中的版本將所有請求傳遞給包含的輸入流。FilterInputStream
子類可以進一步覆蓋其中一些方法,還可以提供其他方法和字段。
javax.servlet.ServletRequestWrapper
(和javax.servlet.ServletResponseWrapper
, javax.servlet.http.HttpServletRequestWrapper
, javax.servlet.http.HttpServletResponseWrapper
)
提供
ServletRequest
接口的便捷實現,該接口可以由希望將請求調整為Servlet的開發人員進行子類化。 此類實現Wrapper或Decorator模式。 方法默認調用包裝的請求對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.