2016-04-12 8 views
11

में श्रोताओं के लिए प्रकार मैं बस अपना वर्गों में से एक में एक छोटा सा पर्यवेक्षक पैटर्न (श्रोताओं) लागू करने के लिए चाहते हैं, और मैं सबसे अच्छा अभ्यास दृष्टिकोण का उपयोग करना चाहते हैं।सही (और सबसे अच्छा) संग्रह जावा

मेरे श्रोता इंटरफ़ेस:

public interface ExpansionListener { 
    void expanded(); 
    void collapsed(); 
} 

इसलिए, मैं श्रोताओं

private List listener; // What kind of list should I take? 

और दो तरीकों addListener(ExpansionListener l) और removeListener(ExpansionListener l) की एक सूची रखना चाहते हैं।

अब, मेरे प्रश्न: मुझे किस प्रकार की सूची लेनी चाहिए? मैंने CopyOnWriteArrayList जैसी समवर्ती सूची का उपयोग करने के बारे में सोचा, लेकिन मुझे पता चला कि EventListenerList भी मौजूद है। जावा में श्रोता-सूचियों के लिए सबसे अच्छा अभ्यास दृष्टिकोण क्या है?

+0

EventListenerList एक अच्छे उम्मीदवार – Sanjeev

+2

मैं एक 'सूची का उपयोग करेंगे प्रतीत हो रहा है ' एक शुरुआत के लिए, यदि आप केवल श्रोता उस तरह की अनुमति देना चाहते। तो शायद मैं 'CopyOnWriteArrayList' के साथ जाऊंगा क्योंकि श्रोताओं में परिवर्तन संभवत: काफी कम है लेकिन लिखने कई धागे के समानांतर में हो सकता है (हालांकि आपके आर्किटेक्चर के बारे में धारणाएं)। – Thomas

+0

एक ऑब्जेक्ट को उसी प्रकार के एकाधिक श्रोताओं से रोकने के लिए एक 'सेट' अधिक उपयुक्त होगा। – Titus

उत्तर

9

CopyOnWriteArrayList सुरक्षित थ्रेड है। सभी स्विंग घटक धागे सुरक्षित नहीं हैं।

नोट: जावा 8 से पहले, इस संग्रह पर पुनरावृत्ति कचरा पैदा करेगा, हालांकि जावा 8 में Iterator एस्केप विश्लेषण के साथ ढेर पर रखा जा सकता है।

final List<EventListener> listeners = new CopyOnWriteArrayList<>(); 

if (!listeners.contains(listener)) 
    listeners.add(listener); 

एक सेट का उपयोग करना esp बेहतर हो के रूप में आप एक धागा सुरक्षित तरीके से एक श्रोता की डुप्लीकेट पंजीकरण की अनदेखी करने के लिए चाहते हो सकता होगा।

final Set<EventListener> listeners = new CopyOnWriteArraySet<>(); 

listeners.add(listener); 

प्रदर्शन, बहुत ही होगा, हालांकि CopyOnWriteArraySet लाभ यह है कि add, परमाणु वह जगह है जहाँ contains कर के रूप में और फिर add परमाणु नहीं है।

संपादित करें: @Hulk आप CopyOnWriteArrayList.addIfAbsent इस्तेमाल कर सकते हैं पता चलता है, लेकिन इस विधि सूची उपलब्ध नहीं है।

final CopyOnWriteArrayList<EventListener> listeners = new CopyOnWriteArrayList<>(); 

listeners.addIfAbsent(listener); 
+0

@ हल्क यह 'CopyOnWriteArrayList' के लिए होगा हालांकि यह' सूची 'पर उपलब्ध नहीं है –

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