私は最近、JavaのObservableクラスについて読んだことがあります。私が理解していないことは、オブザーバ(notifyObservers())に通知する前に、setChanged()を呼び出す必要があります。 notifyObserversメソッド内には、setChangedを呼び出す必要があるブール値があります。ブール値の目的は何ですか?setChanged()を呼び出さなければならない理由は何ですか?なぜオブザーバに通知する前にsetChangedを呼び出す必要がありますか?
21
A
答えて
22
長い治療では、setChanged()を数回呼び出すことができますが、最後には1回だけnotifyObservers()とします。終了する前に、内部的な理由でロールバックを決定した場合は、clearChanged()に電話することを選択することができます。後者の場合、notifyObservers()は効果がありません。
0
状態を変更するための指示またはフラグとしてsetchanged()が使用されます。 trueの場合、notifyObservers()はすべてのobserversを実行して更新できます。notifyObservers()はsetchanged()を呼び出さずに呼び出され、オブザーバは通知されません。
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. insertObject:<Key>のAtIndex:が呼び出されたときにオブザーバに通知する必要がありますか?
- 2. ElapsedMillisecondsを読む前にStopを呼び出す必要がありますか?
- 3. LoadControl()の前にResolveUrl()を呼び出す必要がありますか?
- 4. getspent()の前にlckpwdf()を呼び出す必要がありますか?
- 5. createChannelを呼び出す前に、Channel.Openメソッドを呼び出す必要がありますか?
- 6. glMatrixModeを呼び出すたびにglLoadIdentityを呼び出す必要があるのはなぜですか?
- 7. なぜzumero_syncを何度も呼び出す必要がありますか?
- 8. "WebSecurity"クラスの他のメソッドを呼び出す前に "WebSecurity.InitializeDatabaseConnection"メソッドを呼び出す必要があります
- 9. activate()を呼び出す前にassociate()を呼び出す必要があります
- 10. リポジトリは別のリポジトリを呼び出す必要がありますか?あるいは、リポジトリがサービス層を呼び出す必要がありますか?
- 11. いつsetContentAspectRatioを呼び出す必要がありますか?
- 12. Graphics.Dispose()を呼び出す必要がありますか?
- 13. [convertToGl]を呼び出す必要がありますか?
- 14. クローズ接続を呼び出す必要がありますか?
- 15. いつMessageQueue.EndReceive()を呼び出す必要がありますか?
- 16. いつjava.sql.Connection.rollback()を呼び出す必要がありますか?
- 17. GLSurfaceView:onPause/onResumeを呼び出す必要がありますか?
- 18. SqlTransactionはDisposeを呼び出す必要がありますか?
- 19. ARCでdispatch_releaseを呼び出す必要がありますか?
- 20. TForm.ManualDockはonFormShowを呼び出す必要がありますか?
- 21. html()の前、またはinnerHTMLの前にempty()を呼び出す必要がありますか?
- 22. beforeEach()でspyOnを呼び出す必要があるのはなぜですか?
- 23. PhoneStateListenerでアクティビティを呼び出す必要があります
- 24. statを呼び出す前にファイルをfflushまたは閉じる必要がありますか?
- 25. Xdocument.saveを呼び出す前にスキップする必要がある文字
- 26. OpenGL 2.1でテクスチャを使用する前にglEnable(GL_TEXTURE)を呼び出す必要がありますか?
- 27. MessageDigest.reset()を使用する前にそれを呼び出す必要がありますか?
- 28. 子コントロールごとにSuspendLayoutを呼び出す必要がありますか?
- 29. TFileStream.Createの後にSource.Seek(0、soFromBeginning)を呼び出す必要がありますか?
- 30. 親プロセスで常にlisten()を呼び出す必要がありますか?
それは、この機能は、多くの場合、インスタンスJavaBeansのイベント/リスナーのために、このパターンの他のレンディションに表示されていないことは注目に値しますです。 'Observer' /' Observable'はクラス/インターフェースの酷いペアです。パターンのポイントは、特定のクラスを参照するのではなく、繰り返すことです。 –