Suj*_*jee 9 java collections guava
我正在寻找解释Guava ForwardingList类的示例代码.基本上我正在实现一个自定义的ArrayList类,它将用于解决我之前提出的SO问题中提到的这个要求.我以前从未使用过谷歌收藏.但是通过查看ForwardingList的JavaDoc,我想我可以通过子类化ForwardingList来实现我的自定义类.
pol*_*nts 19
ForwardingList(这extends ForwardingCollection反过来extends ForwardingObject)实现了装饰器模式.
要使用,您只需要做两件事:
@Override delegate() 返回方法转发到的支持委托实例@Override什么List方法,你想/需要装饰Decorator模式可以让您用的组合物,而不是继承(有效的Java第二版,有利于对继承组成),并ForwardingList从番石榴提供了一个方便的模板,从编写自己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);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以测试它如下:
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]
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个不完整的实现.该toString()方法仍然返回委托toString(),但不知道默认值.还有一些其他方法也可以@Override用于更完整的实现.
| 归档时间: |
|
| 查看次数: |
4931 次 |
| 最近记录: |