Guava ForwardingList用法示例
问题内容:
我正在寻找解释Guava
ForwardingList类的示例代码。基本上,我正在实现一个自定义ArrayList类,该类将用于解决我之前的SO问题中提到的这一要求。我以前从未使用过Google收藏。但是,通过查看ForwardingList的JavaDoc,我认为可以通过对ForwardingList进行子类化来实现自定义类。
问题答案:
ForwardingList
(后者extends ForwardingCollection
又extends ForwardingObject
实现了修饰符模式)。
要使用它,您只需要做两件事:
@Override delegate()
返回方法转发到的支持委托实例@Override``List
您想要/需要装饰的任何方法
装饰器模式允许您使用合成而不是继承( Effective Java 2nd Edition,通过继承实现Favor合成
),并且ForwardingList
Guava提供了一个方便的模板来编写您自己的List
实现,从而为您提供所有管道机制。
请注意,如果您打算装饰ArrayList
,则可能希望ForwardingList
子类也实现RandomAccess
。
例: ListWithDefault
这是一个(不完整!)示例,该示例使用给定的默认值ForwardingList
替换null
委托中的值。
import java.util.*;
import com.google.common.collect.*;
public class ListWithDefault<E> extends ForwardingList<E> {
final E defaultValue;
final List<E> delegate;
ListWithDefault(List<E> delegate, E defaultValue) {
this.delegate = delegate;
this.defaultValue = defaultValue;
}
@Override protected List delegate() {
return delegate;
}
@Override public E get(int index) {
E v = super.get(index);
return (v == null ? defaultValue : v);
}
@Override public Iterator<E> iterator() {
final Iterator<E> iter = super.iterator();
return new ForwardingIterator<E>() {
@Override protected Iterator<E> delegate() {
return iter;
}
@Override public E next() {
E v = super.next();
return (v == null ? defaultValue : v);
}
};
}
}
然后我们可以如下进行测试:
public static void main(String[] args) {
List<String> names = new ListWithDefault<String>(
Arrays.asList("Alice", null, "Bob", "Carol", null),
"UNKNOWN"
);
for (String name : names) {
System.out.println(name);
}
// Alice
// UNKNOWN
// Bob
// Carol
// UNKNOWN
System.out.println(names);
// [Alice, null, Bob, Carol, null]
}
请注意,这是 _不完整的_实现。该toString()
方法仍然返回委托的toString()
,它不知道默认值。@Override
为了实现更完整的实现,还必须使用其他一些方法。