У меня есть много примеров в коде, где Collection, чаще всего List, возвращается из метода, и для учета вызывающего абонента, возможно, изменяющего этот список, создается защитная копия.
JDK, похоже, не предоставляет оболочку для этой цели, поэтому я пытаюсь свернуть свою собственную (Примечание: java.util.concurrent.CopyOnWriteArrayList - это не то, что я ищу здесь).
Схематично я пытаюсь:
public class CopyOnWriteList<E> extends List<E> {
protected List<E> list;
protected boolean isCopied;
public CopyOnWriteList(List<E> list) {
this.list = list;
}
private void ensureCopy() {
if (!isCopied) {
list = new ArrayList<E>(list);
isCopied = true;
}
}
public E get(int i) {
return list.get(i);
}
public boolean add(E e) {
ensureCopy();
return list.add(e);
}
// ... many more simple methods
}
Для большей части API это достаточно просто, но, посмотрев на java.util.ArrayList, я обнаружил, что для метода iterator () он возвращает другую реализацию, чем для listIterator (), хотя ListIterator расширяет свой Iterator и не добавляет новых участников.
Интересно, есть ли за этим более глубокая причина - я планировал просто реализовать iterator () и listIterator (), все возвращающие один и тот же тип итератора - ListIterator. Есть ли какая-то логическая причина, по которой нельзя не возвращать ListIterator из метода iterator ()?