如果您知道您的原始列表不会自行更改,并且想要一个包含原始列表的所有内容以及一个新元素的新列表,您可以考虑在两者周围使用包装器,如下所示:
/**
* an immutable wrapper around a list with an added element at the end.
*/
class ImmutableListWrapper<E> extends AbstractList<E> {
private final List<E> delegate;
private final E lastElement;
public ImmutableListWrapper(List<E> start, E last) {
this.delegate = start;
this.lastElement = last;
}
public E get(int index) {
if(index == delegate.size()) {
return lastElement;
}
return delegate.get(index);
}
public int size() {
return delegate.size() + 1;
}
}
public List<Object> f(List<Object> l) {
return new ImmutableListWrapper<Object>(l, new Object());
}
如果原始列表发生变化,新列表也会发生变化,这是设计使然。
如果您的原始列表是非随机访问列表,那么您最好从 AbstractSequentialList 继承并实现委托 ListIterator 而不是 get 方法。