[英]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.