जावा में इवेंट श्रोताओं और हैंडलर्स के बीच क्या अंतर है?


81

जावा के सामान्य शब्दों में, घटनाओं के लिए श्रोता और हैंडलर हैं।
मेरा मतलब है कि मैं अनजाने में उनका उपयोग करता हूं, जो भी एपीआई में उपलब्ध है।

मेरा सवाल यह है कि हम किस मामले में श्रोताओं का उपयोग करते हैं और किस स्थिति में हम घटनाओं के लिए हैंडलर का उपयोग करते हैं?

उनमें क्या अंतर है? विशेषताएँ??

मैंने कारणों की खोज की है और मुझे जावा के लिए उचित स्पष्टीकरण नहीं मिला है।


इस ब्लॉग पोस्ट का एक अच्छा सारांश है। lemnik.wordpress.com/2009/03/04/…
kevinarpe

जवाबों:


62

श्रोताओं और संचालकों के बीच कोई औपचारिक रूप से परिभाषित अंतर नहीं है। कुछ लोग शायद यह तर्क देंगे कि वे विनिमेय हैं। हालांकि, मेरे पास उनके कुछ अलग मायने हैं।

एक श्रोता एक ऐसी वस्तु है जो एक स्रोत से घटनाओं के लिए सदस्यता लेता है। सी एफ पर्यवेक्षक पैटर्न । आमतौर पर आपके पास प्रत्येक प्रकार के आयोजन के लिए कई श्रोता हो सकते हैं, और वे इसके माध्यम से जुड़ जाते हैंaddXyzListener विधियों के है।

उदाहरण:MouseListener जावा एपीआई में।

एक हैंडलर एक ऐसी वस्तु है जो कुछ घटनाओं को संभालने के लिए जिम्मेदार है। एक विशिष्ट परिदृश्य एक निर्माता के लिए एक तर्क के रूप में एक विशिष्ट घटना / कार्य के लिए एक हैंडलर प्रदान करना होगा, या एक विधि के माध्यम से हैंडलर सेट करना होगा setXyzHandler। दूसरे शब्दों में, आपके पास आमतौर पर प्रत्येक प्रकार की घटना के लिए एक हैंडलर होता है ।

उदाहरण:MemoryHandler जावा एपीआई में।


नमस्ते आपके उत्तर के लिए धन्यवाद। "घटनाओं के लिए सदस्यता" से आपका क्या मतलब है? "श्रोताओं" से आपका क्या मतलब है?
BKSpurgeon

@BKSpurgeon, उत्तर में ऑब्जर्वर पैटर्न से जुड़ा विकिपीडिया लेख देखें।
Aioobe

33

सबसे बुनियादी अंतर एसोसिएशन है

  • श्रोता इवेंट सोर्स से जुड़ा है (पूर्व: की-बोर्ड)
  • हैंडलर एक ईवेंट के साथ जुड़ा हुआ है (उदा: कीडाउन)

सामान्यतया, केवल एक केंद्रीय हैंडलर प्रबंधक होता है जो सभी घटनाओं का प्रबंधन करता है, जबकि श्रोता के मामले में प्रत्येक इकाई जो सुनना चाहता है, उसे अपने स्वयं के श्रोताओं के संग्रह का प्रबंधन करना होगा


माउस ईवेंट स्रोत है, यदि आप सादृश्य को देखते हैं माउस लिस्टनर को ईवेंट स्रोत के साथ जोड़ा जाता है, जो माउस है
स्वप्निल

23

इस तरह से मैं इसे देखता हूं:

एक श्रोता एक घटना के लिए निकाल दिया जाता है देखता है। उदाहरण के लिए, KeyListenerKeyEvents की प्रतीक्षा करता है, aMessageListener कतार में आने के लिए संदेशों की प्रतीक्षा करता है और इसी तरह।

हैंडलर घटना से निपटने के लिए जिम्मेदार है। आम तौर पर, श्रोता और हैंडलर हाथ से जाते हैं। उदाहरण के लिए, KeyListener ExitHandler को बताती है कि "अक्षर Q दबाया गया था" और हैंडलर संसाधनों को साफ करने और एप्लिकेशन को शालीनता से बाहर निकालने जैसे तर्क करता है। Similary एक ButtonClickListener एक ही ExitHandler को बताएगा कि "Exit बटन पर क्लिक किया गया था"। तो, इस मामले में आपके पास दो अलग-अलग घटनाएं हैं, दो अलग-अलग श्रोता हैं लेकिन एक ही हैंडलर है।


5

एक श्रोता एक ऐसी वस्तु है जिसे किसी घटना के होने पर अधिसूचित किया जाता है, और इसकी 2 प्रमुख आवश्यकताएँ होती हैं- 1-इसे एक या अधिक स्रोतों से पंजीकृत किया जाना चाहिए ताकि विशिष्ट प्रकार के ईवेंट 2 के बारे में सूचनाएं प्राप्त की जा सकें - इसे प्राप्त करने और संसाधित करने के तरीकों को लागू करना चाहिए ये सूचनाएं हैंडलर घटनाओं से निपटने के लिए जिम्मेदार है।


4

एक श्रोता, उन घटनाओं के लिए सुनता है जो डेटा मूल्य ऑब्जेक्ट हैं जो एक घटना का वर्णन करते हैं। जब घटना हुई और घटनाओं का क्रम अक्सर महत्वपूर्ण है। '1' के बाद '1' दबाने पर '1' और '0' से अलग होता है।

एक हैंडलर, एक जटिल वस्तु को संभालता है जैसे एक नया सॉकेट कनेक्शन। हैंडलर किसी भी लम्बाई के लिए ऑब्जेक्ट को प्रोसेस कर सकता है। वस्तु निर्माण और व्यवस्था का समय इतना महत्वपूर्ण नहीं है। किसी भी क्रम में client0 या client1 से एक कनेक्शन हो सकता है।


4

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


4

मेरे दिमाग में, सबसे महत्वपूर्ण अंतर यह है कि हम प्रति घटना के स्रोत के प्रति श्रोताओं का उपयोग करते हैं, जो हैंडलर के विपरीत है, जो कि घटना के प्रकार के अनुसार है।


2

वे वैचारिक रूप से एक ही चीज़ हैं - एक ऐसी वस्तु जो UI घटना के जवाब में कुछ क्रिया करती है। आम तौर पर, स्विंग में, इन ऑब्जेक्ट्स को लुक-एंड-फील लेवल (लो-लेवल विजेट ईवेंट्स को हैंडल करने के लिए), और "ऐब्सर्स" को और अधिक यूआई लेवल पर (जहां आप अपने एप्लिकेशन लॉजिक को लागू कर रहे हैं) कहा जाता है। ) का है।


0

EventHandler को सभी UI नियंत्रणों के लिए JavaFX में पेश किया गया है। जबकि वेधशालाओं जैसे गुणों के लिए श्रोता को उधार लिया जाता है।

द इवेंटहैंडलर अवलोकन योग्य घटनाओं और यूआई घटनाओं को अलग करने का एक तरीका है।


0

मैं सभी सूचनाओं की समझ बनाने की कोशिश कर रहा हूं और मैं हार गया हूं। मैंने डेल्फी (पास्कल), सी, सी ++, जावा को देखा है ... कुछ भी स्पष्ट नहीं है। एक महीने के बाद, यह समस्या है क्योंकि मैं इसे देखता हूं। मैं पूरी तरह से ट्रैक हो सकता हूं, इसलिए कृपया मुझे बताएं ... विनम्रता से, कृपया।

एक घटना प्रेषक, एक पकड़ने वाला जब तक प्रेषक पकड़ने का पंजीकरण करता है। मेरे पास 4 डायलॉग बॉक्स हैं जिन्हें हर बार एक फाइल (जिसका हैंडलिंग कोड 4 डायलॉग बॉक्स की तुलना में किसी अन्य मॉड्यूल में है) को अपडेट करने की आवश्यकता है। मैंने प्रत्येक पुराने तरीके से अपडेट करने पर विचार किया, लेकिन फिर मैंने डेल्फी इवेंट्स और मैसेज हैंडलिंग को देखा। चलो देखते हैं:

फ़ाइल एफ (प्रेषक) पढ़ना समाप्त हो गया है और डायलॉग्स 1..4 को इस तथ्य को सूचित करना चाहिए कि अब उनके पास प्रदर्शित करने के लिए और उपयोगकर्ता के साथ खेलने के लिए डेटा है। सबसे अच्छा क्या है?

श्रोताओं के रूप में डायलॉग १..४ को पंजीकृत करने का प्रयास करें और प्रेषक को किसी तरह एक OnUpdatedDataEvent ट्रिगर करें?

पूरे सिस्टम में एक संदेश भेजने की कोशिश करें, उम्मीद है कि डायलॉग 1..4 इसे पकड़ लेगा?

ध्यान दें कि ईवेंट मैसेजिंग करते समय चीजों को जोड़े रखता है ... और डिबग करने के लिए एक दर्द है।

और मुझे आश्चर्य है कि कोड का फ़ाइल ब्लॉक 4 श्रोताओं (संवाद बॉक्स) को कैसे पंजीकृत कर पाएगा?

मैं जो देख रहा हूं वह कैस्केड कॉलिंग की संभावना है, जिसका अर्थ है कि कॉलर एक श्रोता को कॉल करता है, जिसे अगला कॉल करता है ... जब तक यह श्रृंखला के अंत तक नहीं पहुंचता। मुझे आश्चर्य है कि अगर यह भी संभव है।

एक उदाहरण:

कहो फ़ाइल एफ भाषाओं की एक सूची है। अब, डायलॉगबॉक्स 1 सूची में कुछ करता है (उदाहरण के लिए एक नई भाषा जोड़ता है); वह कॉम्बो बॉक्स F फाइल को अपडेट करता है; यह बदले में एक DataUpdatedEvent चलाता है। 4 डायलॉग बॉक्स में, कहते हैं, TComboBoxes जो पॉप अप करते समय भाषा सूची प्रदर्शित करते हैं। मैं चाहता हूं कि 4 बॉक्स परिवर्तन को नोटिस करें और अपने स्वयं के कॉम्बो बॉक्स की सामग्री को ताज़ा अपडेट की गई फ़ाइल के साथ अपडेट करें ... बिना इस बात की चिंता किए कि कॉम्बो बॉक्स कैसे जानते हैं कि उन्हें अपनी सामग्री को ताज़ा करने की आवश्यकता है। यदि यह प्रेषित पैरामीटर के रूप में काम करता है तो प्रेषक पैरामीटर पार ले जाएगा और डेटाअप ट्रिगर करने वाले संवाद बॉक्स को बायपास किया जाएगा क्योंकि यह पहले से ही अपडेट किया जाएगा। आखिरकार अगर कोई प्रेषक = स्वयं तो अगले ईवेंट हैंडलर को लागू करना आसान होना चाहिए।

वह सब क्योंकि मैं अपने मस्तिष्क का उपयोग करना चाहता हूं ... अल्जाइमर को रोकने के लिए, बहुत सफलतापूर्वक मैं जोड़ नहीं सकता।


नमस्ते वहाँ, और StackOverflow में आपका स्वागत है! क्या इसका मतलब मूल प्रश्न का उत्तर है ("जावा में इवेंट श्रोताओं और हैंडलर्स के बीच अंतर क्या है?")। यदि हां, तो इसे फिर से लागू करने में मदद मिल सकती है ताकि यह जावा में घटना श्रोताओं बनाम हैंडलर की विशेषताओं को स्पष्ट रूप से समझाते हुए, अधिक सीधे सवाल का जवाब दे।
एलेक्स लेव

-1

यह शब्दार्थ है।

  • श्रोता इंटरफ़ेस है।
  • एडाप्टर वह वर्ग है जो विशिष्ट इंटरफ़ेस को लागू करता है और इसके तरीकों के लिए खाली कार्यान्वयन प्रदान करता है। यह मदद करता है अगर आपको इंटरफ़ेस के सभी तरीकों को लागू करने की आवश्यकता नहीं है।
  • हैंडलर कई इंटरफेस को लागू करता है या प्रतिनिधियों को कई इंटरफेस को कॉल करता है।

1
मैं यह नहीं कहूंगा कि एक श्रोता जरूरी एक इंटरफ़ेस है। BasicButtonListener उदाहरण के लिए एक ठोस वर्ग है।
ऐयोबेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.