Guava ForwardingList用法示例

我正在寻找解释Guava ForwardingList类的示例代码。 基本上我正在实现一个自定义的ArrayList类,它将用于解决我之前的SO问题中提到的这个要求。 我之前从未使用过Googlecollections。 但是通过查看ForwardingList的JavaDoc ,我想我可以通过子类化ForwardingList来实现我的自定义类。

ForwardingListextends 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; } }