2013-02-27 234 views
21

मैंने हाल ही में जावा के Observable कक्षा के बारे में पढ़ा है। जो मुझे समझ में नहीं आता है यह है: पर्यवेक्षकों को सूचित करने से पहले (NOTifyObservers()) मुझे setChanged() को कॉल करना होगा। अधिसूचना के अंदर एक बुलियन है जिसे ऑब्सर्वर विधि है जिसे हमें सेट चेंज करने की आवश्यकता होती है। बुलियन मूल्य का उद्देश्य क्या है और मुझे setChanged() क्यों कॉल करना चाहिए?पर्यवेक्षकों को सूचित करने से पहले मुझे सेट चेंज को कॉल करने की आवश्यकता क्यों है?

+1

यह ध्यान देने योग्य है कि इस सुविधा अक्सर इस पैटर्न के अन्य renditions में प्रकट नहीं होता है, उदाहरण के JavaBeans घटनाओं/श्रोताओं के लिए लायक है है। 'पर्यवेक्षक'/'पर्यवेक्षण योग्य वर्ग/इंटरफ़ेस की एक भयानक जोड़ी है। पैटर्न की बात यह है कि विशिष्ट वर्गों का जिक्र करने के बजाए दोहराना। –

उत्तर

22

लंबे उपचार में आप कई बार setChanged() पर कॉल कर सकते हैं लेकिन अंत में, केवल एक बार notifyObservers()। यदि, अंत में, आंतरिक कारण के लिए आप रोलबैक का निर्णय लेते हैं तो आप clearChanged() पर कॉल करना चुन सकते हैं। बाद के मामले में, notifyObservers() का कोई प्रभाव नहीं है।

0

सेटchanged() को राज्य बदलने के लिए संकेत या ध्वज के रूप में उपयोग किया जाता है। यदि यह सच है तो NOTifyObservers() सभी पर्यवेक्षकों को चला और अपडेट कर सकता है। अगर यह गलत है तो अधिसूचित ऑब्सर्वर() को setchanged() को कॉल किए बिना बुलाया जाता है और पर्यवेक्षकों को अधिसूचित नहीं किया जाएगा।

1

कारण कारण सेट किया जा सकता है चेंज() में एक संरक्षित संशोधक है। इस बीच, सूचित करें ऑब्सर्वर() को पर्यवेक्षक द्वारा कहीं भी बुलाया जा सकता है। चूंकि, पर्यवेक्षक और पर्यवेक्षक इस तंत्र के साथ एक दूसरे के साथ बातचीत कर सकते हैं।

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

टिप्पणी कारण