我有以下代码:
public class MyObservable extends Observable {
// ...
public void doSomething() {
// do stuff
setChanged();
notifyObservers();
}
}
public class A implements Observer {
public void update(Observable o, Object arg) {
// do something
}
}
public class B implements Observer {
public void update(Observable o, Object arg) {
// do something
}
}
和主要功能:
public static void main(String[] args) {
MyOvervable a = new MyObservable();
a.addObserver(new A());
a.addOberser(new B());
a.doSomething();
}
notifyObservers()
调用更新函数的顺序是否与我用addObserver()
添加观察者的顺序相同? 最佳答案
Javadoc for Observable表示,通知是按照注册侦听器的顺序进行的,但这是不正确的-通知实际上是以相反的顺序进行的。
代码节选和解释性注释:
// addObserver() adds last-most at end of the list
public synchronized void addObserver(Observer o) {
..
obs.addElement(o);
}
public void notifyObservers(Object arg) {
..
// notifyObservers iterates backwards; last-most first.
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
我提交了一个错误报告https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8214760,但是由于不推荐使用Observable,因此已将其关闭,因为“无法修复”。
我的信念是,所实施的行为是稳定的,不会改变。更改顺序可能会破坏许多使用此命令的应用程序的兼容性。