gpt4 book ai didi

Java 观察者模式 - 如何在更新(通知)循环/迭代期间删除观察者?

转载 作者:搜寻专家 更新时间:2023-10-31 19:46:34 24 4
gpt4 key购买 nike

我是 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);
}
}

最佳答案

一种方法是前往CopyOnWriteArraylist而不是 ArrayList 。

CopyOnWriteArraylist is a thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.

它在你的案例中被抛出的原因

当它在方法 changeValue() 下迭代集合时,您正在直接修改集合

关于Java 观察者模式 - 如何在更新(通知)循环/迭代期间删除观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19197579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com