我最近读了Java的Observable类。我不明白的是:在通知观察者(notifyObservers())之前,我必须调用setChanged()。 notifyObservers方法中有一个布尔值,它要求我们调用setChanged。这个布尔值的目的是什么,为什么我必须调用setChanged()?为什么我在通知观察者之前需要调用setChanged?
21
A
回答
22
在长时间的治疗中,您可能会拨打setChanged()多次,但最后只有一次notifyObservers()。如果在结束之前由于内部原因决定回滚,您可以选择拨打clearChanged()。在后一种情况下,notifyObservers()不起作用。
0
setchanged()用作指示或用于更改状态的标志。如果它是真的,则notifyObservers()可以运行并更新所有的观察者。如果它没有调用setchanged(),那么调用notifyObservers()并且不会通知观察者。
1
可能的原因可能是setChanged()有一个受保护的修饰符。同时,notifyObservers()可以在任何地方被调用,即使是观察者也是如此。从那以后,观察者和观察者可以通过这种机制相互作用。
0
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Observer[] arrLocal;
synchronized (this) {
/* We don't want the Observer doing callbacks into
* arbitrary Observables while holding its own Monitor.
* The code where we extract each Observable from
* the ArrayList and store the state of the Observer
* needs synchronization, but notifying observers
* does not (should not). The worst result of any
* potential race-condition here is that:
*
* 1) a newly-added Observer will miss a
* notification in progress
* 2) a recently unregistered Observer will be
* wrongly notified when it doesn't care
*/
if (!hasChanged())
return;
arrLocal = observers.toArray(new Observer[observers.size()]);
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
arrLocal[i].update(this, arg);
}
的评论是什么原因
相关问题
- 1. 为什么我们需要观察者模式?
- 2. 我需要知道什么时候完成Firebase观察
- 3. 为什么在我的可观察序列中需要第二次onSubscribe()调用?
- 4. 使用观察者模式来为订阅者建模通知
- 5. 观察者和主题观察者模式之间有什么区别
- 6. 为什么可观察快照观察者矢量
- 7. AngularJS - 为什么观察者被移除?
- 8. 观察者和回调之间有什么大不同?
- 9. 为什么不从NSNotificationCenter中删除观察者:addObserverForName:usingBlock被调用
- 10. 何时需要删除观察者
- 11. 移除观察者通知Swift 3
- 12. 为什么我的观察者在相同的变化中被调用两次?
- 13. 在Ruby之前我需要知道什么?
- 14. 为什么我需要在sigaddset()之前使用sigemptyset()函数?
- 15. 我需要在观察者中访问url_helper方法,我该怎么做?
- 16. 尽管观察者被移除,通知观察者多次呼叫
- 17. 为什么我需要在调用window.open()之后写alert()?
- 18. 为什么我需要在ISession之后调用ISession.Flush.Delete
- 19. 为什么我需要在jQuery调用之间放置1ms setTimeout()?
- 20. iPhone操作系统:KVO:为什么我的观察者只能在应用程序中得到通知DIDfinishLaunching
- 21. 为什么需要创建可观察的集合
- 22. 在使用IM应用程序之前,我需要知道些什么?
- 23. 为什么我们需要在wait()之前锁定()?
- 24. 为什么我需要在has_devel()= TRUE之前运行find_rtools()?
- 25. 在insertObject时应该通知观察者:在<Key> AtIndex:被调用?
- 26. 观察者模式 - 观察者创建
- 27. 观察者模式 - 什么时候到
- 28. 将属性设置为undefined时没有通知观察者
- 29. 我需要从NSNotificationCenter中删除观察者一次,还是一次添加观察者?
- 30. refCount:在连接“n”观察者之后调用底层ConnectObservable.connect()
值得一提的是此功能不经常出现在这种模式的其他再现,比如JavaBeans的事件/监听器。 'Observer' /'Observable'是一对糟糕的类/接口。模式的重点在于重复,而不是指向特定的类。 – 2013-02-27 20:00:41