जवाबों:
ऐसा क्यों है? क्या इसका मतलब है कि हमें अब पर्यवेक्षक पैटर्न को लागू नहीं करना चाहिए?
पहले भाग का उत्तर देना -
हाँ , इसका मतलब यह है कि आपकोअबObserverऔरलागू नहीं करना चाहिएObervable।
उन्होंने अनुप्रयोगों के लिए एक समृद्ध पर्याप्त ईवेंट मॉडल प्रदान नहीं किया। उदाहरण के लिए, वे केवल इस धारणा का समर्थन कर सकते हैं कि कुछ बदल गया है, लेकिन जो कुछ भी बदला है उसके बारे में कोई जानकारी नहीं दी।
एलेक्स का जवाब यह अच्छी तरह से ObserverसामनेObservable रखता है कि कमजोरी है: सभी एक ही हैं । आपको उस तर्क को लागू करना होगा जो instanceofठोस प्रकार में Observable.update()विधि पर आधारित और कास्ट ऑब्जेक्ट पर आधारित है ।
इसे जोड़ने के लिए कीड़े थे जैसे कोई वर्ग को अनुक्रमित नहीं कर सकताObservable क्योंकि यह Serializableइंटरफ़ेस लागू नहीं करता था और इसके सभी सदस्य निजी थे।
इससे बेहतर विकल्प क्या हो सकता है?
दूसरी ओर Listenersबहुत सारे प्रकार हैं और उनके पास कॉलबैक विधियां हैं और उन्हें कास्टिंग की आवश्यकता नहीं है। जैसा कि @Ravi ने अपने उत्तर में बताया है कि आप PropertyChangeListenerइसके बजाय इसका उपयोग कर सकते हैं ।
इसके बाकी हिस्सों के @Deprecationलिए अन्य पैकेजों के साथ-साथ अन्य उत्तरों में भी लिंक करने के लिए उचित दस्तावेज के साथ चिह्नित किया गया है।
ध्यान दें कि इस मेल में बताए गए विश्लेषण के साथ अपचयन को भी चिह्नित किया गया था -
इन दिनों, इनसे मुठभेड़ करने वाला कोई भी व्यक्ति
RxJavaया अन्य प्रतिक्रियाशील-धारा रूपरेखाओं का उपयोग करते हुए शायद गलती से उन्हें मार रहा है । जिस स्थिति में, उपयोगकर्ता सामान्य रूप से jdk9java.util.concurrent.FlowAPI का उपयोग करना चाहते हैं, जो कि सभी प्रतिक्रियाशील-स्ट्रीम फ्रेमवर्क उनके नियोजित आगामी jdk9- संगत संस्करणों के भीतर संगत / इंटरऑपरेबल होना चाहिए।
संपादित करें : यह भी ध्यान देने योग्य है कि एपीआई का अपव्यय केवल मुख्य रूप से उपरोक्त कारण से नहीं है, लेकिन यह भी ऐसी विरासत कोड को बनाए रखने में असमर्थ है, जैसा कि बग की कुछ रिपोर्टों (ऊपर जुड़ा हुआ) की टिप्पणियों में उल्लेख किया गया है। एक या दूसरे तरीके से इसके कार्यान्वयन में सुधार को चिह्नित करें।
Listenerएक ऑब्जर्वर भी है।
हां, यह जावा 9 में पदावनत है । और, हम अब पर्यवेक्षक पैटर्न को लागू नहीं कर सकते हैं।
अधिक कारण हैं:
अनुक्रमिक नहीं - चूंकि, अवलोकन योग्य नहीं है। इसलिए, आप अवलोकन को न तो सीरियल कर सकते हैं और न ही इसके उपवर्ग को।
कोई थ्रेड सेफ्टी नहीं - इसके उपवर्गों द्वारा विधियों को ओवरराइड किया जा सकता है, और इवेंट नोटिफिकेशन अलग-अलग ऑर्डर में और संभवत: विभिन्न थ्रेड्स पर हो सकता है, जो किसी भी "थ्रेड सेफ्टी" को बाधित करने के लिए पर्याप्त है।
वे अनुप्रयोगों के लिए एक समृद्ध पर्याप्त ईवेंट मॉडल प्रदान नहीं करते हैं। उदाहरण के लिए, वे केवल इस धारणा का समर्थन करते हैं कि कुछ बदल गया है, लेकिन जो कुछ भी बदला है उसके बारे में उन्हें कोई जानकारी नहीं है
खुले मुद्दे - जैसा कि उल्लेख किया गया है, बहुत सारे प्रमुख मुद्दे उठाए गए थे (थ्रेड सुरक्षा, सीरियल करने योग्य) और उनमें से अधिकांश को ठीक करने के लिए जटिलताएं थीं और अभी भी "निश्चित नहीं" या कोई सक्रिय विकास नहीं है , और यही कारण है कि इसे हटा दिया गया है ।
मैं इस जवाब को पढ़ने की भी सिफारिश करूंगा कि पर्यवेक्षक पैटर्न को क्यों हटाया जाना चाहिए? , @ जेफ ने पदावनति के अन्य कारणों की व्याख्या की है।
आप उपयोग कर सकते हैं PropertyChangeEventऔर PropertyChangeListenerसे java.beansपैकेज।
PropertyChangeListenerकी जगह Observer, लेकिन क्या मैं के स्थान पर विस्तार / लागू करना चाहिए Observable?
PropertyChangeSupportएक उदाहरण चर के रूप में जोड़ना है , लेकिन मैं एक पुष्टि की सराहना करता हूं।
क्यों पर्यवेक्षक जावा 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 देखें
यह देखते हुए कि Observableवर्ग 9 और Observerइंटरफ़ेस को जावा 9 के रूप में चित्रित किया गया है। पोस्ट के अनुसार जावा के ऑब्जर्वर और ऑब्जर्वेबल JDK 9 में पदावनत हैं
ऑब्जर्वर और ऑब्जर्वेबल द्वारा समर्थित इवेंट मॉडल काफी सीमित है, ऑब्जर्वेबल द्वारा दिए गए नोटिफिकेशन का क्रम अनिर्दिष्ट है, और राज्य परिवर्तन सूचनाओं के लिए एक-से-एक पत्राचार में नहीं हैं। एक समृद्ध ईवेंट मॉडल के लिए,
java.beansपैकेज का उपयोग करने पर विचार करें । थ्रेड्स के बीच विश्वसनीय और ऑर्डर किए गए संदेश के लिए,java.util.concurrentपैकेज में समवर्ती डेटा संरचनाओं में से एक का उपयोग करने पर विचार करें । प्रतिक्रियाशील धाराओं शैली प्रोग्रामिंग के लिए, फ्लो एपीआई देखें।