2013-02-27 7 views
21

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?

+1

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

risposta

0

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.

1

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.

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

Il commento è il motivo

Problemi correlati