Ho letto di recente sulla classe Observable di Java. Quello che non capisco è questo: prima di notificare gli osservatori (notifyObservers()) devo chiamare setChanged(). C'è un booleano all'interno del metodo notifyObservers che richiede di chiamare setChanged. Qual è lo scopo del valore booleano e perché devo chiamare setChanged()?Perché devo chiamare setChanged prima di notificare gli osservatori?
risposta
In un trattamento lungo è possibile chiamare più volte setChanged() ma alla fine, solo una volta notifyObservers(). Se, prima della fine, per motivi interni decidi di effettuare il rollback, puoi scegliere di chiamare clearChanged(). Nel caso successivo, notifyObservers() non ha alcun effetto.
il setchanged() viene utilizzato come indicazione o contrassegno per la modifica dello stato. se è vero, notifyObservers() può eseguire e aggiornare tutti gli osservatori. Se è falso, viene chiamato notifyObservers() senza chiamare setchanged() e gli osservatori non saranno avvisati.
il motivo può essere impostatoCambia() ha un modificatore protetto. Nel frattempo, notifyObservers() potrebbe essere invocato ovunque, anche da un osservatore. Da allora, osservabile e osservatore possono interagire l'un l'altro con questo meccanismo.
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);
}
Il commento è il motivo
- 1. Quando dovrei rimuovere gli osservatori? Errore nel deallocare gli oggetti prima di rimuovere gli osservatori
- 2. Devo chiamare File.Exists prima di chiamare File.Delete?
- 3. Perché devo chiamare super -dialloc per ultimo, e non prima?
- 4. Devo chiamare Stop prima di leggere ElapsedMilliseconds?
- 5. Devo chiamare MessageDigest.reset() prima di usarlo?
- 6. Perché devo chiamare spyOn in beforeAach()?
- 7. Come recuperare tutti gli osservatori di NSNotificationCenter?
- 8. Devo chiamare la variabile due volte prima di valutare?
- 9. Perché devo fare ldarg.0 prima di chiamare un campo in MSIL?
- 10. Devo chiamare Graphics.Dispose()?
- 11. Java Observer modello non notificare
- 12. Ordine di notificare gestori
- 13. Perché chiamare quit() prima di exec() non esce dall'applicazione?
- 14. Devo removeTarget prima addTarget
- 15. Perché NHibernate non elimina prima gli orfani?
- 16. Semplice modo di disattivare gli osservatori durante il rake task?
- 17. ApplicationEventMulticaster non inizializzata - chiamare 'Aggiorna' prima che gli eventi multicasting
- 18. Devo chiamare Close() su un ManualResetEvent?
- 19. GLSurfaceView: Devo chiamare onPause/onResume?
- 20. Devo chiamare "makefile" o "Makefile"?
- 21. Osservatori di mutazione --- sottostruttura
- 22. Come chiamare un evento prima di Environment.Exit()?
- 23. controllo per NULL prima di chiamare liberi
- 24. Devo chiamare addSubview dopo aver chiamato addChildViewController?
- 25. Devo controllare Debugger.IsAttached prima di Debugger.Break o Debug.WriteLine?
- 26. VB.NET: Devo chiamare Thread.MemoryBarrier() prima di ogni lettura se completo sempre le mie scritture con Thread.MemoryBarrier()?
- 27. Osservatori e callback
- 28. Devo mai chiamare dispatch_release sotto ARC?
- 29. Saldatura - Osservatori eventi asincroni
- 30. Perché gli osservatori delle proprietà non possono essere aggiunti alle proprietà lazy?
Vale la pena notare che questa caratteristica non appare spesso in altre interpretazioni di questo modello, per esempio JavaBeans eventi/ascoltatori. 'Observer' /' Observable' è una coppia terribile di classe/interfaccia. Il punto dei modelli è quella ripetizione, piuttosto che il riferimento a classi specifiche. –