2010-07-13 7 views
12

जब मैंने जावा में ईवेंट को कैसे आग लगाना सीखा, तो मैं EventListenerList से परिचित हो गया। जब मैं अपने खुद के श्रोताओं बनाने के लिए, मैं श्रोता लिखने तो यह EventListener फैली हुई है, मैं उन्हें एक EventListenerList में स्टोर, और मेरे आग विधि इस तरह घटना श्रोताओं के माध्यम से जाना होगा:श्रोताओं के सामान्य संग्रह के बजाय EventListenerList का उपयोग कब करें

protected void fireChangeOccurred(Change change) { 
    Object[] listeners = listenerList.getListenerList(); 
    for (int i = listeners.length-2; i>=0; i-=2) { 
     if (listeners[i]==ChangeListener.class) { 
      ((ChangeListener)listeners[i+1]).changeOccurred(change); 
     } 
    } 
} 

अब मैं की समीक्षा कर रहा हूँ कोड है कि बस एक HashMap में श्रोताओं डालता है (किसी भी संग्रह किया जा सकता है), श्रोता इंटरफ़ेस EventListener विस्तार नहीं करता है, और आग विधि इस प्रकार है:

protected void fireChangeOccurred(Change change) { 
    for (ChangeListener listener : listeners) { 
     listener.changeOccurred(change); 
    } 
} 

क्या EventListenerList का उपयोग कर के बजाय सिर्फ अपने ही बनाए रखने के फायदे हैं श्रोताओं की सूची? क्या यह वाकई केवल तभी मायने रखता है जब श्रोताओं स्विंग घटक में हों - क्या यह इवेंट डिस्पैच थ्रेड के लिए महत्वपूर्ण है?

+5

बस यह सुनिश्चित करने के लिए कि आप जानते हैं, वे 2 लूप समान नहीं हैं - पहला वाला अंतिम-से-पहले होता है, और दूसरा पहला-से-आखिरी बार पुनरावृत्त होता है। यदि श्रोता को स्वयं को हटाने की अनुमति है (जो वे आमतौर पर होते हैं), तो आप अगले श्रोता को छोड़ने से रोकने के लिए अंतिम-से-पहले पुनरावृत्ति करना चाहेंगे यदि वर्तमान वाला स्वयं को हटा देता है। –

उत्तर

6

मेरे लिए, EventListenerList का प्रमुख लाभ यह है कि यदि कक्षा में एक से अधिक श्रोता के हैं (या हो सकता है) है। कई स्विंग घटक करते हैं; जिसकी आप समीक्षा कर रहे हैं वह नहीं हो सकता है। दूसरा उदाहरण छोटा है, लेकिन इसमें अंतर्निहित डिज़ाइन सीमा है।

+0

लेकिन क्या आप सिर्फ श्रोताओं की एक अलग सूची नहीं रखेंगे - उदाहरण के लिए बनाम सूची सूची? –

+0

@ डेविड: हाँ, और प्रत्येक प्रकार के श्रोता के लिए; 'जेटीबल 'आठ तक है, लेकिन अभी भी एक सूची है। 'EventListenerList' सरणी एक विरासत है; गैर-स्विंग घटनाओं के लिए, एक संग्रह समझ में आता है। हालांकि, मैं टाइप-टोकन को संरक्षित रखूंगा। – trashgod

+0

@ डेविड: संदर्भ के लिए, [टैग: jfreechart] एक लाइब्रेरी का एक ठोस उदाहरण है जो एकाधिक ईवेंट प्रकारों को प्रबंधित करने के लिए 'EventListenerList' का उपयोग करता है। – trashgod

3

इस दिन कोई बड़ा लाभ नहीं है। बस छोटे अनुकूलन। इस वर्ग प्रदान करता है

मुख्य लाभ यह है कि हैं कि यह कोई श्रोताओं के मामले में अपेक्षाकृत सस्ती है, और यह घटना श्रोता के लिए क्रमबद्धता एक ही स्थान पर सूचीबद्ध करता है प्रदान करता है, के रूप में: यहाँ क्या Javadocs कहते है अच्छी तरह से एमटी सुरक्षा के (जब सही ढंग से उपयोग किया जाता है)

आधुनिक जेवीएम और संग्रह के साथ यह वास्तव में कोई फर्क नहीं पड़ता। लेकिन अगर आप स्विंग का उपयोग करते हैं तो आप अपने कार्यान्वयन के साथ क्या कर सकते हैं, ईडीटी पर बदलावों को आग लगाने का तरीका प्रदान करता है - जो फायदेमंद होगा।

7

EventListenerList में method, getListeners(Class<T> t) है, खासकर उस मामले के लिए जहां आप केवल एक ईवेंट प्रकार में रुचि रखते हैं।

इसका इस्तेमाल इस तरह के एक उदाहरण है:

protected void fireChangeOccurred(Change change) { 
    for (ChangeListener listener: 
     listenerList.getListeners(ChangeListener.class)) { 
      listener.stateChanged(new ChangeEvent(this)); 
    } 
} 

आप श्रोताओं के अपने खुद के संग्रह बनाए रखने के लिए चुनते हैं, तो मैं एक CopyOnWriteArrayList सलाह देते हैं।

संबंधित मुद्दे