Ich habe kürzlich über Javas Observable Klasse gelesen. Was ich nicht verstehe, ist folgendes: Bevor ich die Beobachter benachrichtige (notifyObserver()) muss ich setChanged() aufrufen. In der Methode notifyObservers gibt es eine boolesche Methode, die das Aufrufen von setChanged erfordert. Was ist der Zweck des booleschen Wertes und warum muss ich setChanged() aufrufen?Warum muss ich setChanged aufrufen, bevor ich die Beobachter benachrichtige?
Antwort
In einer langen Behandlung können Sie mehrere Male setChanged() anrufen, aber am Ende, nur einmal notifyObservers(). Wenn Sie sich vor dem Ende aus internen Gründen für einen Rollback entscheiden, können Sie wählen, clearChanged() aufzurufen. Im letzteren Fall hat notifyObservers() keine Wirkung.
Das Setchanged() wird als Anzeige oder Flag zum Ändern des Status verwendet. Wenn es wahr ist, kann die notifyObserver() alle Beobachter ausführen und aktualisieren. Wenn sie falsch ist, wird die notifyObservers() aufgerufen, ohne die setchanged() aufzurufen, und die Beobachter werden nicht benachrichtigt.
Der Grund kann gesetzt werdenChanged() hat einen geschützten Modifikator. Inzwischen kann notifyObservers() auch von einem Beobachter überall aufgerufen werden. Seitdem können Beobachter und Beobachter mit diesem Mechanismus interagieren.
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);
}
Der Kommentar ist der Grund,
- 1. Muss ich Crashlytics.start mehrmals aufrufen?
- 2. Warum muss ich die Binding Source Position ändern, bevor ich SaveChanges
- 3. Warum muss ich std :: move auf einem temporären dynamic_bitset aufrufen?
- 4. Warum muss ich in einem beforeEach() spyOn aufrufen?
- 5. Warum muss ich zuerst super-dealloc aufrufen, und nicht zuerst?
- 6. Muss ich jemals dispatch_release unter ARC aufrufen?
- 7. Muss ich AWT lernen, bevor ich Swing lerne?
- 8. Muss ich eine SQLConnection schließen(), bevor sie entsorgt wird?
- 9. Muss ich die offAuth-Methode beim Abmelden aufrufen?
- 10. Warum muss ich einen Zeichenzeiger in C nicht dereferenzieren, bevor ich ihn drucke?
- 11. Warum muss ich JValue explizit auf einen Zieltyp umwandeln, bevor ich es verwende?
- 12. Warum muss ich [ProtoInclude] verwenden?
- 13. Muss ich Ereignissubskriptionen von Objekten entfernen, bevor sie verwaist sind?
- 14. Soll ich removeTarget bevor ich
- 15. Warum muss ich Clone überschreiben, wenn ich klonbare Klasse möchte?
- 16. Methode aufrufen, bevor die Sitzung abläuft
- 17. Muss ich die AlarmManager.cancel() Methode verwenden?
- 18. Warum muss ich "reopenClass" aufrufen, um die URL für ein Glutendatenmodell festzulegen?
- 19. Warum muss ich Adapter.notifyDataSetChanged() nicht verwenden?
- 20. Soll ich Stop aufrufen, bevor ElapsedMilliseconds gelesen wird?
- 21. warum ich Wert auszupacken, bevor ich verwenden ist
- 22. Warum möchte Git, dass ich ziehe, bevor ich drücke?
- 23. Warum kann ich File :: open (...). Read_to_end() aufrufen?
- 24. Warum muss ich VHDL-Komponenten neu deklarieren, bevor Sie sie in anderen Architekturen instanziieren?
- 25. Warum muss ich meine ob_start() beenden?
- 26. Warum muss ich `sys.stdin = codecs.getreader (sys.stdin.encoding) (sys.stdin)`?
- 27. Warum muss ich selbst auf ID umwandeln?
- 28. Warum muss ich hier std :: stringstream löschen?
- 29. Warum muss ich ISession.Flush nach ISession.Delete rufen
- 30. Warum muss ich eine Grammatik umschreiben?
Es ist erwähnenswert, dass diese Funktion nicht oft in anderen Interpretationen dieses Musters erscheint, zum Beispiel Java Beans Ereignisse/Zuhörern. 'Observer' /' Observable' ist ein schreckliches Paar von Klassen/Interfaces. Der Punkt von Mustern ist diese Wiederholung, anstatt sich auf bestimmte Klassen zu beziehen. –