我对java很陌生,如果我说的任何话听起来很新鲜,请提前抱歉,请保持温和。
我已经实现了一个基本的观察者模式。一些观察者应该只听一次更新,然后立即将自己从观察者/听众列表中删除。但是,每当我尝试这样做时,都会遇到著名的java.util.concurrentmodificationexception错误。
我显然收到了这个错误,因为我在更改列表的同时仍在对其进行迭代,但我仍然不确定什么是正确的解决方案。我想知道我是否以正确的方式这样做。如果我是,那么需要什么修复才能使其正常工作?如果我不是,我想获得一些建议,以更好地实现我正在尝试做的事情。
这是我的代码:
public interface Listener {
public void onValueChange(double newValue);
}
public class Observed {
private int value;
List<Listener> listeners = new ArrayList<>();
public void addListener(Listener toAdd) {
listeners.add(toAdd);
}
public void removeListener(Listener toRemove) {
listeners.remove(toRemove);
}
public void changeValue(double newValue) {
value = newValue;
for (Listener l : listeners) l.onValueChange(newValue);
}
}
public class SomeClassA implements Listener{
private Observed observed;
SomeClassA(Observed observed) {
this.observed = observed;
}
@Override
public void onValueChange(double newValue) {
System.out.println(newValue);
observed.removeListener(this);
}
}
public class SomeClassB implements Listener{
@Override
public void onValueChange(double newValue) {
System.out.println(newValue);
}
}
public class ObserverTest {
public static void main(String[] args) {
Observed observed = new Observed();
SomeClassA objectA = new SomeClassA(observed);
SomeClassB objectB = new SomeClassB();
observed.addListener(objectB);
observed.addListener(objectA);
observed.changeValue(4);
}
}