ForwardingList (哪一个 extends ForwardingCollection ,反过来 extends ForwardingObject 实现 装饰图案 。
ForwardingList
extends ForwardingCollection
extends ForwardingObject
要使用,您只需要做两件事:
@Override delegate()
@Override
List
装饰器模式允许您使用组合而不是继承( 有效的Java第二版,支持组合而不是继承 ),和 ForwardingList 来自Guava提供了一个方便的模板,您可以从中编写自己的模板 List 实现,为您提供所有的管道机制。
请注意,如果您打算装饰一个 ArrayList ,你可能想要你的 ForwardingList 子类也要实现 RandomAccess 。
ArrayList
RandomAccess
ListWithDefault
这是一个(不完整!)的例子 ForwardingList 替代品 null 具有给定默认值的委托中的值。
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 以及更完整的实施。
toString()
你应该实施 代表() ForwardingList的方法,用于返回您在元素中使用的委托列表。
public class YourList<E> extends ForwardingList<E> { private final List<E> delegate; public YourList(List<E> list1, List<E> list2) { delegate = new ArrayList<E>(list1); delegate.addAll(list2); } @Override public List<E> delegate() { return delegate; } }