【发布时间】:2013-05-19 07:10:34
【问题描述】:
我遇到以下问题:
给定:
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);
}
}
}
}
使用此代码,只需调用 A.getElements().clear() 就会触发 ConcurrentModificationException... 并且没关系,因为我正在从元素列表中删除所有链接的元素,同时删除一个元素。这就是为什么我需要另一种方法。
【问题讨论】:
-
请告诉我们导致此错误的代码。
-
你如何将此观察者附加到迭代器?
-
如果
linkedElements是elements列表的精确副本,我建议在 A 和 B 之间共享列表,而不是同步删除。
标签: java exception collections iterator concurrentmodification