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