次の問題があります。
与えられた:
public class A{
Collection<B> elements = new ArrayList<B>();
}
public class B{
Collection<B> linkedElements = new ArrayList<B>();
}
linkedElements のすべての要素も要素に属します。要素が要素コレクションから削除されるたびに、そのリンクされた要素もそのコレクションから削除されるようにしたいと考えています。オブザーバーを Iterator.remove 操作にアタッチして、そこで要素リストからのlinkedElementsの削除を実行しようとしましたが、ロジック自体が原因で、常に ConcurrentModificationException に遭遇します。
更新:これはエラーの原因となるコードです:
public class A{
Collection<B> elements = new ArrayList<B>(){
public Iterator<B> iterator() {
return new ProxyIterator(super.iterator());
};
private class ProxyIterator implements Iterator{
Iterator it;
Object lastObject;
public ProxyIterator(Iterator proxied){
it = proxied;
}
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public Object next() {
return lastObject = it.next();
}
@Override
public void remove() {
it.remove()
for (B linkedElement : ((B)lastObject).getlinkedElements()) {
A.this.getElements().remove(linkedElement);
}
}
}
}
このコードでは、 aA.getElements().clear()
を呼び出すだけで a ConcurrentModificationException
... が発生します。1 つの要素を削除しながら、要素リストからすべてのリンクされた要素を削除しているためです。だからこそ、別のアプローチが必要なのです。