पर्यवेक्षक जावा 9 में पदावनत है। हमें इसके बजाय क्या उपयोग करना चाहिए?


133

जावा 9 बाहर आया, और Observerहटा दिया गया है। ऐसा क्यों है? क्या इसका मतलब है कि हमें अब पर्यवेक्षक पैटर्न को लागू नहीं करना चाहिए?

यह जानना अच्छा होगा कि एक बेहतर विकल्प क्या है?

जवाबों:


104

ऐसा क्यों है? क्या इसका मतलब है कि हमें अब पर्यवेक्षक पैटर्न को लागू नहीं करना चाहिए?

पहले भाग का उत्तर देना -

हाँ , इसका मतलब यह है कि आपकोअबObserverऔरलागू नहीं करना चाहिएObervable

उन्हें क्यों निकाला गया -

उन्होंने अनुप्रयोगों के लिए एक समृद्ध पर्याप्त ईवेंट मॉडल प्रदान नहीं किया। उदाहरण के लिए, वे केवल इस धारणा का समर्थन कर सकते हैं कि कुछ बदल गया है, लेकिन जो कुछ भी बदला है उसके बारे में कोई जानकारी नहीं दी।

एलेक्स का जवाब यह अच्छी तरह से ObserverसामनेObservable रखता है कि कमजोरी है: सभी एक ही हैं । आपको उस तर्क को लागू करना होगा जो instanceofठोस प्रकार में Observable.update()विधि पर आधारित और कास्ट ऑब्जेक्ट पर आधारित है ।

इसे जोड़ने के लिए कीड़े थे जैसे कोई वर्ग को अनुक्रमित नहीं कर सकताObservable क्योंकि यह Serializableइंटरफ़ेस लागू नहीं करता था और इसके सभी सदस्य निजी थे।

इससे बेहतर विकल्प क्या हो सकता है?

दूसरी ओर Listenersबहुत सारे प्रकार हैं और उनके पास कॉलबैक विधियां हैं और उन्हें कास्टिंग की आवश्यकता नहीं है। जैसा कि @Ravi ने अपने उत्तर में बताया है कि आप PropertyChangeListenerइसके बजाय इसका उपयोग कर सकते हैं ।

इसके बाकी हिस्सों के @Deprecationलिए अन्य पैकेजों के साथ-साथ अन्य उत्तरों में भी लिंक करने के लिए उचित दस्तावेज के साथ चिह्नित किया गया है।


ध्यान दें कि इस मेल में बताए गए विश्लेषण के साथ अपचयन को भी चिह्नित किया गया था -

इन दिनों, इनसे मुठभेड़ करने वाला कोई भी व्यक्ति RxJavaया अन्य प्रतिक्रियाशील-धारा रूपरेखाओं का उपयोग करते हुए शायद गलती से उन्हें मार रहा है । जिस स्थिति में, उपयोगकर्ता सामान्य रूप से jdk9 java.util.concurrent.FlowAPI का उपयोग करना चाहते हैं, जो कि सभी प्रतिक्रियाशील-स्ट्रीम फ्रेमवर्क उनके नियोजित आगामी jdk9- संगत संस्करणों के भीतर संगत / इंटरऑपरेबल होना चाहिए।

संपादित करें : यह भी ध्यान देने योग्य है कि एपीआई का अपव्यय केवल मुख्य रूप से उपरोक्त कारण से नहीं है, लेकिन यह भी ऐसी विरासत कोड को बनाए रखने में असमर्थ है, जैसा कि बग की कुछ रिपोर्टों (ऊपर जुड़ा हुआ) की टिप्पणियों में उल्लेख किया गया है। एक या दूसरे तरीके से इसके कार्यान्वयन में सुधार को चिह्नित करें।


3
+1। अच्छा जवाब, हालांकि मैं अभी भी इसे समझने की कोशिश कर रहा हूं। क्या जावा में ऑब्ज़र्वर डिज़ाइन पैटर्न की कुछ अंतर्निहित समस्या (GOF द्वारा पुस्तक में परिभाषित के रूप में) या जावा द्वारा पैटर्न के लिए समर्थन की समस्या के कारण पदावनत है? अन्य OO भाषाओं में, जैसे C #, C ++, Python, क्या पर्यवेक्षक डिज़ाइन पैटर्न में भी जावा की तरह ही समस्या है?
टिम

25
तथ्य यह है कि एक विशेष कार्यान्वयन पदावनत है इसका मतलब यह नहीं है कि ऑब्जर्वर पैटर्न मोटे तौर पर त्रुटिपूर्ण है। Listenerएक ऑब्जर्वर भी है।
क्राय्लिस -कुट्योपोटेमिमिस्टिक-

@chrylis थैंक्स, कैन ने अधिक सहमति व्यक्त की, एपीआई को अपदस्थ करने का एक मुख्य कारण इसके साथ जुड़ा हुआ रखरखाव भी है और इसके कार्यान्वयन को बदलने से अन्य कोड भी टूट सकते हैं।
नमन

@ curious95 वहाँ समवर्ती को सूचित करने के तरीके को समझने में सक्षम नहीं है ।
नमन

4
@ curious95 हाँ कॉलिंग notifyObservers()समवर्ती है। यहाँ विवरणों में इसकी कार्यक्षमता समझाने के लिए समान साझा से एक कोडलेट है।
नमन

37

हां, यह जावा 9 में पदावनत है । और, हम अब पर्यवेक्षक पैटर्न को लागू नहीं कर सकते हैं।


ऐसा क्यों है?

अधिक कारण हैं:

अनुक्रमिक नहीं - चूंकि, अवलोकन योग्य नहीं है। इसलिए, आप अवलोकन को न तो सीरियल कर सकते हैं और न ही इसके उपवर्ग को।

कोई थ्रेड सेफ्टी नहीं - इसके उपवर्गों द्वारा विधियों को ओवरराइड किया जा सकता है, और इवेंट नोटिफिकेशन अलग-अलग ऑर्डर में और संभवत: विभिन्न थ्रेड्स पर हो सकता है, जो किसी भी "थ्रेड सेफ्टी" को बाधित करने के लिए पर्याप्त है।

पेशकश करने के लिए कम -

वे अनुप्रयोगों के लिए एक समृद्ध पर्याप्त ईवेंट मॉडल प्रदान नहीं करते हैं। उदाहरण के लिए, वे केवल इस धारणा का समर्थन करते हैं कि कुछ बदल गया है, लेकिन जो कुछ भी बदला है उसके बारे में उन्हें कोई जानकारी नहीं है

खुले मुद्दे - जैसा कि उल्लेख किया गया है, बहुत सारे प्रमुख मुद्दे उठाए गए थे (थ्रेड सुरक्षा, सीरियल करने योग्य) और उनमें से अधिकांश को ठीक करने के लिए जटिलताएं थीं और अभी भी "निश्चित नहीं" या कोई सक्रिय विकास नहीं है , और यही कारण है कि इसे हटा दिया गया है ।

मैं इस जवाब को पढ़ने की भी सिफारिश करूंगा कि पर्यवेक्षक पैटर्न को क्यों हटाया जाना चाहिए? , @ जेफ ने पदावनति के अन्य कारणों की व्याख्या की है।


तो, हमारे पास क्या विकल्प है?

आप उपयोग कर सकते हैं PropertyChangeEventऔर PropertyChangeListenerसे java.beansपैकेज।


PropertyChangeListenerकी जगह Observer, लेकिन क्या मैं के स्थान पर विस्तार / लागू करना चाहिए Observable?
LastStar007

अद्यतन: मुझे लगता है कि दृष्टिकोण PropertyChangeSupportएक उदाहरण चर के रूप में जोड़ना है , लेकिन मैं एक पुष्टि की सराहना करता हूं।
लास्टस्टार 007

3
@ LastStar007 मुझे लगता है कि आप सही हैं। मुझे Baeldung.com पर एक कोड सैंपल मिला, जो ऐसा करता है।
ड्रैगोस स्टैनिकु

13

क्यों पर्यवेक्षक जावा 9 में पदावनत है?

उत्तर:Observable वर्ग और Observerइंटरफ़ेस जावा 9 में पदावनत किया गया है क्योंकि द्वारा समर्थित घटना मॉडल Observerऔर Observableकाफी सीमित है, के द्वारा दिया सूचनाओं के क्रम Observableअनिर्दिष्ट है, और राज्य में परिवर्तन एक के लिए एक अधिसूचना के साथ पत्राचार में नहीं हैं।

Java doc https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html देखें

प्रेक्षक पैटर्न का विकल्प?

ऑब्जर्वर डिजाइन पैटर्न के कई विकल्प हैं और रिएक्टिव स्ट्रीम उनमें से एक है।

प्रतिक्रियाशील धाराएँ या प्रवाह API :

Flowएक वर्ग जावा 9 में शुरू की और 4 परस्पर इंटरफेस है: Processor, Publisher, Subscriberऔर Subscription

Flow.Processor : एक घटक जो एक सब्सक्राइबर और प्रकाशक दोनों के रूप में कार्य करता है।

Flow.Publisher : सब्सक्राइबर्स द्वारा प्राप्त वस्तुओं का निर्माता।

Flow.Subscriber : संदेशों का रिसीवर।

Flow.Subscription: संदेश नियंत्रण जोड़ने एक Flow.Publisherऔर Flow.Subscriber

Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html देखें


7

यह देखते हुए कि Observableवर्ग 9 और Observerइंटरफ़ेस को जावा 9 के रूप में चित्रित किया गया है। पोस्ट के अनुसार जावा के ऑब्जर्वर और ऑब्जर्वेबल JDK 9 में पदावनत हैं

ऑब्जर्वर और ऑब्जर्वेबल द्वारा समर्थित इवेंट मॉडल काफी सीमित है, ऑब्जर्वेबल द्वारा दिए गए नोटिफिकेशन का क्रम अनिर्दिष्ट है, और राज्य परिवर्तन सूचनाओं के लिए एक-से-एक पत्राचार में नहीं हैं। एक समृद्ध ईवेंट मॉडल के लिए, java.beans पैकेज का उपयोग करने पर विचार करें । थ्रेड्स के बीच विश्वसनीय और ऑर्डर किए गए संदेश के लिए, java.util.concurrentपैकेज में समवर्ती डेटा संरचनाओं में से एक का उपयोग करने पर विचार करें । प्रतिक्रियाशील धाराओं शैली प्रोग्रामिंग के लिए, फ्लो एपीआई देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.