我最近讀了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. 爲什麼`collect`讓觀察者沒有收到通知?
- 3. 我需要知道什麼時候完成Firebase觀察
- 4. 不再需要刪除可可中的通知觀察者?
- 5. 爲什麼我需要在fireTableRowsInserted()之前調用getRowSorter()。modelStructureChanged()
- 6. 爲什麼在我的可觀察序列中需要第二次onSubscribe()調用?
- 7. 爲什麼在調用AviFileExit()之前需要調用IAviFile指針?
- 8. 在swift中添加通知觀察者
- 9. 爲什麼在可觀察對象作爲新線程運行時沒有通知觀察者?
- 10. 爲什麼我不需要發佈這個冷觀察?
- 11. 使用觀察者模式來爲訂閱者建模通知
- 12. Observable Java類:clearChanged()並通知觀察者...什麼順序?
- 13. 觀察者和主題觀察者模式之間有什麼區別
- 14. AngularJS - 爲什麼觀察者被移除?
- 15. 爲什麼可觀察快照觀察者矢量
- 16. 爲什麼我們在將其轉換爲Promise之前不需要訂閱可觀察的內容?
- 17. 觀察者和回調之間有什麼大不同?
- 18. 爲什麼不從NSNotificationCenter中刪除觀察者:addObserverForName:usingBlock被調用
- 19. 爲什麼在需要之前選擇?
- 20. 何時需要刪除觀察者
- 21. 爲什麼我的觀察者在相同的變化中被調用兩次?
- 22. 通知觀察者 - 綁定入門
- 23. 發佈通知多個觀察者
- 24. 收集變空時通知觀察者
- 25. 移除觀察者通知Swift 3
- 26. 在Magento付款之後,最早可以觀察的觀察者是什麼?
- 27. 在Ruby之前我需要知道什麼?
- 28. Magento哪個事件被調用?需要構建觀察者
- 29. 斯威夫特 - 通知觀察者多次調用
- 30. 我需要在觀察者中訪問url_helper方法,我該怎麼做?
值得一提的是此功能不經常出現在這種模式的其他再現,比如JavaBeans的事件/監聽器。 'Observer' /'Observable'是一對糟糕的類/接口。模式的重點在於重複,而不是指向特定的類。 – 2013-02-27 20:00:41