Guava ForwardingList用法示例
我正在寻找解释Guava ForwardingList类的示例代码。 基本上我正在实现一个自定义的ArrayList类,它将用于解决我之前的SO问题中提到的这个要求。 我之前从未使用过Googlecollections。 但是通过查看ForwardingList的JavaDoc ,我想我可以通过子类化ForwardingList来实现我的自定义类。
ForwardingList
( extends ForwardingCollection
,后者又extends ForwardingObject
)实现了装饰器模式 。
要使用,您只需要做两件事:
-
@Override delegate()
返回方法转发到的支持委托实例 -
@Override
你想要/需要装饰的任何List
方法
装饰器模式允许您使用组合而不是inheritance( Effective Java 2nd Edition,Favor composition over inheritance ),来自Guava的ForwardingList
提供了一个方便的模板,可以从中编写自己的List
实现,为您提供所有的管道机制。
请注意,如果您计划装饰ArrayList
,您可能希望ForwardingList
子类也实现RandomAccess
。
示例: ListWithDefault
这是ForwardingList
的一个(不完整的!)示例,它使用给定的默认值替换委托中的null
值。
import java.util.*; import com.google.common.collect.*; public class ListWithDefault extends ForwardingList { final E defaultValue; final List delegate; ListWithDefault(List 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 iterator() { final Iterator iter = super.iterator(); return new ForwardingIterator () { @Override protected Iterator delegate() { return iter; } @Override public E next() { E v = super.next(); return (v == null ? defaultValue : v); } }; } }
然后我们可以测试它如下:
public static void main(String[] args) { List names = new ListWithDefault ( 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
才能实现更完整的实现。
您应该实现ForwardingList的delegate()方法以返回您在元素中使用的委托列表。
public class YourList extends ForwardingList { private final List delegate; public YourList(List list1, List list2) { delegate = new ArrayList (list1); delegate.addAll(list2); } @Override public List delegate() { return delegate; } }