2013-02-27 9 views
21

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?

+1

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. –

Antwort

0

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.

1

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.

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); 
} 

Der Kommentar ist der Grund,

Verwandte Themen