2012-04-18 31 views
19

मैं सी # दुनिया से जावा में आ रहा हूं जहां ऑब्जर्वर पैटर्न को event कीवर्ड के साथ प्रथम श्रेणी की भाषा निर्माण के रूप में कार्यान्वित किया गया है।जावा के पर्यवेक्षण वर्ग के लिए वैकल्पिक?

मुझे लगता है कि शुरुआती दिनों से जावा के पास Observable कक्षा थी, लेकिन इसमें स्पष्ट रूप से कार्यान्वयन के मुद्दे हैं और इसका व्यापक रूप से उपयोग नहीं किया जाता है। अब तक मैं अपने जावा कोड में ऑब्जर्वर पैटर्न का अपना खुद का कार्यान्वयन कर रहा हूं लेकिन मैं हमेशा मदद नहीं कर सकता लेकिन लगता हूं कि इस बॉयलरप्लेट कोड को हमेशा चालू करने के लिए बेहतर विकल्प होना चाहिए। स्विंग में श्रोता वर्ग हैं लेकिन वे गैर-स्विंग कोड के लिए उपयुक्त नहीं लगते हैं।

इस ओह-आम समस्या के लिए अनुशंसित समाधान क्या है? तीसरे पक्ष के पुस्तकालय मेरे साथ ठीक हैं।

+0

गैर-स्विंग कोड के लिए श्रोता वर्ग उचित क्यों नहीं हैं? – Jeffrey

+0

ऐसा लगता है कि सभी इवेंट लिस्टनर व्युत्पन्न इंटरफेस और कक्षाएं स्विंग और एडब्ल्यूटी पैकेज में हैं। चूंकि वे ऐसे पैकेज में हैं जो यूआई के लिए ज़िम्मेदार है, गैर यूआई के लिए उनका उपयोग करना मुझे एक बुरी गंध की तरह लगता है। क्या EventListeners इन UI संदर्भों के बाहर उपयोग किया जाता है? – HolySamosa

+3

आपको अपनी श्रोता कक्षाओं को प्राप्त करने से रोकने के लिए कौन है? 'EventListener' और' EventObject' दोनों 'java.util' में हैं, वे किसी भी तरह से एडब्ल्यूटी या स्विंग से बंधे नहीं हैं। – Jeffrey

उत्तर

17

आमतौर पर पर्यवेक्षक पैटर्न को किसी भी विज्ञापन-समाधान समाधान के साथ लागू किया जाता है जब कभी इसकी आवश्यकता होती है। जब व्यवहार पैटर्न की बात आती है तो यह सबसे सरल है: "पर्यवेक्षकों" की सूची को नियंत्रित करने के लिए दो विधियां और एक विधि जो कुछ दिलचस्प होने पर पर्यवेक्षकों को सूचित करती है।

पर्यवेक्षक पैटर्न कुछ डोमेन के बाहर बहुत बार उत्पन्न होता है, और जब यह उत्पन्न होता है तो यह एप्लिकेशन डोमेन के लिए बहुत विशिष्ट होता है, इसलिए सामान्य समाधान कम मूल्य के होते हैं। आप java.util.Observable वर्ग के साथ समस्या यह देख सकते हैं:

  • क्या होगा यदि: यदि आप Observable से विरासत आप जो संभावना आपके आवेदन के लिए कोई मतलब नहीं है "पर्यवेक्षक" है कि आप के लिए पारित किया जा सकता है, के हर संभव तरह स्वीकार करना होगा आपकी वस्तु दो अलग-अलग प्रकार की घटनाओं का उत्पादन कर सकती है, और इस प्रकार पर्यवेक्षकों की दो अलग-अलग सूचियों की आवश्यकता है?
  • क्या होगा अगर पर्यवेक्षक घटना के आधार पर आपकी वस्तु को प्रभावित कर सकें, उदा। एक परिवर्तन वीटो करने में सक्षम होने के द्वारा?

जिसके अनुसार, EventBus from Google Guava घटना को सरल बनाने के उत्पादन और एक बिल्कुल भिन्न दृष्टिकोण लेने के द्वारा से निपटने में एक बहुत अच्छा काम करने के लिए लगता है।

अन्य techniques based on annotations have been discussed on SO पहले।

+0

उत्तर के लिए धन्यवाद। मुझे जेनेरिक पर्यवेक्षक समाधानों के बारे में आपके बयान के बारे में निश्चित जानकारी नहीं है, हालांकि मैं उस तर्क को जावा के पर्यवेक्षक कार्यान्वयन पर लागू कर सकता हूं। सी # को फिर से लाने के लिए, ऑब्जर्वर अपने 'इवेंट' निर्माण में प्रथम श्रेणी का नागरिक है जिसका उपयोग .NET में भारी रूप से किया जाता है। मुझे लगता है कि जेनेरिक पर्यवेक्षक को अभी ठीक से लागू किया जाना चाहिए, और शायद यह मामला है कि इसे खींचने के लिए वास्तव में एक भाषा निर्माण की आवश्यकता है। – HolySamosa

+1

हां, एक भाषा निर्माण की आवश्यकता है।उदाहरण के लिए यदि आपके पास 'एन' विभिन्न प्रकार की घटनाएं हैं तो कक्षा श्रोताओं को प्रबंधित करने के तरीकों के' एन 'सेट के साथ बढ़ाया जाना चाहिए। लेकिन जावा भाषा लाइब्रेरी कक्षाओं के लिए मनमाने ढंग से तरीकों को जोड़ नहीं सकती है जहां इसका उपयोग किया जाता है। – Joni

+0

हमारे द्वारा उपयोग किए जाने वाले प्रमुख मुद्दे। ऑब्जेरबल या मूल गोफ दृष्टिकोण यह है कि एक बड़े अनुप्रयोग में, थ्रेडिंग, डेडलॉक और प्रदर्शन पागल हो जाता है। हमने अपने ऐप को भी बस दृष्टिकोण –

4

This article स्प्रिंग फ्रेमवर्क का उपयोग करके पैटर्न का एक अच्छा कार्यान्वयन दिखाता है। आपको अभी भी अपने विषय और पर्यवेक्षक इंटरफेस (और कार्यान्वयन) को परिभाषित करने की आवश्यकता है, लेकिन वसंत एक्सएमएल कॉन्फ़िगरेशन के माध्यम से ऑब्जेर्वर पंजीकरण विषयों पर विषय को संभालती है।

5

मैं reactive programming में देखने की अनुशंसा करता हूं। जावा में केवल एक ही कार्यान्वयन है जिसे मैं जानता हूं: reactive4java

+0

ग्रेट सुझाव के साथ बदल दिया, धन्यवाद। मैंने हाल ही में अपने सी # विकास में प्रतिक्रियाशील एक्सटेंशन का उपयोग शुरू किया और यह काफी प्रभावशाली है। – HolySamosa