元のリストがそれ自体では変更されないことがわかっていて、元のリストのすべての内容と 1 つの新しい要素を含む新しいリストが必要な場合は、次のように両方のラッパーを使用することを検討できます。
/**
* 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 から継承し、get メソッドの代わりに委譲 ListIterator を実装することをお勧めします。