मैंने हाल ही में जावा के Observable कक्षा के बारे में पढ़ा है। जो मुझे समझ में नहीं आता है यह है: पर्यवेक्षकों को सूचित करने से पहले (NOTifyObservers()) मुझे setChanged() को कॉल करना होगा। अधिसूचना के अंदर एक बुलियन है जिसे ऑब्सर्वर विधि है जिसे हमें सेट चेंज करने की आवश्यकता होती है। बुलियन मूल्य का उद्देश्य क्या है और मुझे setChanged() क्यों कॉल करना चाहिए?पर्यवेक्षकों को सूचित करने से पहले मुझे सेट चेंज को कॉल करने की आवश्यकता क्यों है?
उत्तर
लंबे उपचार में आप कई बार setChanged() पर कॉल कर सकते हैं लेकिन अंत में, केवल एक बार notifyObservers()। यदि, अंत में, आंतरिक कारण के लिए आप रोलबैक का निर्णय लेते हैं तो आप clearChanged() पर कॉल करना चुन सकते हैं। बाद के मामले में, notifyObservers() का कोई प्रभाव नहीं है।
सेटchanged() को राज्य बदलने के लिए संकेत या ध्वज के रूप में उपयोग किया जाता है। यदि यह सच है तो NOTifyObservers() सभी पर्यवेक्षकों को चला और अपडेट कर सकता है। अगर यह गलत है तो अधिसूचित ऑब्सर्वर() को setchanged() को कॉल किए बिना बुलाया जाता है और पर्यवेक्षकों को अधिसूचित नहीं किया जाएगा।
कारण कारण सेट किया जा सकता है चेंज() में एक संरक्षित संशोधक है। इस बीच, सूचित करें ऑब्सर्वर() को पर्यवेक्षक द्वारा कहीं भी बुलाया जा सकता है। चूंकि, पर्यवेक्षक और पर्यवेक्षक इस तंत्र के साथ एक दूसरे के साथ बातचीत कर सकते हैं।
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);
}
टिप्पणी कारण
- 1. क्या मुझे इसका उपयोग करने से पहले MessageDigest.reset() को कॉल करने की आवश्यकता है?
- 2. मुझे मार्शल को कॉल करने की आवश्यकता है। सी #
- 3. क्या मुझे ग्राफिक्स को कॉल करने की आवश्यकता है। प्रदर्शन()?
- 4. . हमें System.gc(); को कॉल करने की आवश्यकता क्यों है ??
- 5. eval का उपयोग करने से पहले मुझे $ @ स्थानीयकरण करने की आवश्यकता क्यों है?
- 6. क्लास.get एन्नोटेशन() को मुझे कास्ट करने की आवश्यकता क्यों है?
- 7. क्या SqlCommandBuilder.GetUpdateCommand() को SqlDataAdpater.Update() का उपयोग करने से पहले कॉल करने की आवश्यकता है?
- 8. मुझे DJANGO_SETTINGS_MODULE सेट की आवश्यकता क्यों है?
- 9. मुझे सरणी से पहले तारांकन की आवश्यकता क्यों है?
- 10. मुझे कॉल करने की आवश्यकता कब है - [UIViewController initWithNibName: बंडल:]?
- 11. detoured फ़ंक्शन से मूल फ़ंक्शन को कॉल करने की आवश्यकता
- 12. प्रोग्राम चलाने से पहले कुछ इंस्टॉलर्स को कंप्यूटर को पुनरारंभ करने की आवश्यकता क्यों होती है?
- 13. क्या मुझे संदेश बॉक्स कॉल करने की आवश्यकता है?
- 14. ProcessMessages को कॉल करने की आवश्यकता से बचें
- 15. क्या मुझे इसका उपयोग करने के बाद HttpURLConnection.disconnect को कॉल करने की आवश्यकता है
- 16. क्या मुझे std :: fstream को बंद करने की आवश्यकता है?
- 17. मुझे पर्यवेक्षकों को कब हटा देना चाहिए? पर्यवेक्षकों को हटाने से पहले वस्तुओं को हटाने के बारे में त्रुटि
- 18. क्या मुझे servlet outputstream को फ्लश करने की आवश्यकता है?
- 19. एसिंक्रोनस प्रतिनिधि विधि को EndInvoke को कॉल करने की आवश्यकता क्यों होती है?
- 20. क्या मुझे तत्व निकालने से पहले jquery ईवेंट को अनइंड करने की आवश्यकता है?
- 21. क्या मुझे आधार वर्चुअल विनाशक को स्पष्ट रूप से कॉल करने की आवश्यकता है?
- 22. printf पर कॉल करने से पहले% eax शून्य क्यों है?
- 23. अन्य आर्किटेक्चर में उन्हें तुरंत चालू करने से पहले मुझे वीएचडीएल घटकों को फिर से चलाने की आवश्यकता क्यों है?
- 24. मुझे इस विधि को कॉल करने की आवश्यकता कब है Runtime.getRuntime()। AddShutdownHook()
- 25. क्या मुझे @ सिंथेसाइज को शामिल करने की आवश्यकता है?
- 26. क्या मुझे xib संसाधनों को रिलीज़ करने की आवश्यकता है?
- 27. संसाधनों को बंद करने के लिए मुझे अंततः उपयोग करने की आवश्यकता क्यों है?
- 28. आपको WORKON_HOME पर्यावरण चर सेट करने की आवश्यकता क्यों है?
- 29. क्या मुझे टाइमआउट के बाद एंडइवोक को कॉल करने की आवश्यकता है?
- 30. क्या मुझे वास्तव में प्रत्येक प्रिंसिपल पर निपटान() को कॉल करने की आवश्यकता है?
यह ध्यान देने योग्य है कि इस सुविधा अक्सर इस पैटर्न के अन्य renditions में प्रकट नहीं होता है, उदाहरण के JavaBeans घटनाओं/श्रोताओं के लिए लायक है है। 'पर्यवेक्षक'/'पर्यवेक्षण योग्य वर्ग/इंटरफ़ेस की एक भयानक जोड़ी है। पैटर्न की बात यह है कि विशिष्ट वर्गों का जिक्र करने के बजाए दोहराना। –