2010-05-30 13 views
11

श्रोता सूची क्यों सूचीबद्ध हैं (उदा। जावा में जो addXxxListener() और removeXxxListener() का उपयोग श्रोताओं को पंजीकृत और अनधिकृत करने के लिए करते हैं) सूचीबद्ध करते हैं, और आमतौर पर Lists के रूप में लागू किए जाते हैं? नहीं एक Set एक बेहतर फिट, के बाद से श्रोताओं के मामले में वहाँश्रोता सूची सूचीबद्ध क्यों हैं?

  • कोई फर्क नहीं पड़ता जो क्रम में वे कहा जाता हो (हालांकि वहाँ अच्छी तरह से ऐसी जरूरतों हो सकता है, लेकिन वे विशेष मामलों रहे हैं हो सकता है; साधारण श्रोता तंत्र ऐसी कोई गारंटी देता है), और
  • ही श्रोता रजिस्टर करने के लिए एक बार से अधिक (कर रही है कि क्या एक ही श्रोता बुला 1 बार या N बार परिणाम चाहिए, या कोई त्रुटि हो कोई ज़रूरत नहीं, एक और सवाल)
है

क्या यह सिर्फ परंपरा का मामला है? वैसे भी हुड के नीचे किसी प्रकार की सूचियां सेट हैं। क्या प्रदर्शन अंतर हैं? एक Set के माध्यम से List तेज या धीमी गति से चल रहा है? या तो कम या ज्यादा स्मृति लेते हैं? मतभेद निश्चित रूप से लगभग नगण्य हैं।

+10

'कारण यह एक सूची है? : पी – kennytm

उत्तर

8

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

तो, इसके बजाय, श्रोताओं को एक सूची के रूप में संग्रहीत किया जाता है और पीछे के क्रम में अधिसूचित किया जाता है। फिर, यदि श्रोता श्रोताओं की सूची से स्वयं को हटाए जाने पर हटा देता है, तो यह एक समवर्ती मोडिफिकेशन अपवाद का कारण नहीं बनता है या अन्य गैर-अभी तक अधिसूचित श्रोताओं के सूचकांक को स्थानांतरित नहीं करता है।

+0

क्या होगा यदि आपको आदेश की परवाह नहीं है? –

+0

यदि आपके श्रोताओं ने अधिसूचित होने के जवाब में खुद को हटा दिया है, तो आपको परवाह करनी चाहिए। अन्यथा, आपने आदेश को संरक्षित करके कुछ खोया नहीं है। – Mark

+0

अगर वे खुद को हटा देते हैं, तो मुझे क्यों परवाह करना चाहिए? मुझे लगता है कि ज्यादातर मामलों के लिए, एक सेट का उपयोग करना ठीक है। श्रोताओं को आम तौर पर अन्य श्रोताओं की तुलना में बुलाए जाने के बारे में धारणा नहीं करना चाहिए। हो सकता है कि एक SkipList इस के लिए समाधान में मध्य है? अजीब, मुझे इसके लिए जावा क्लास नहीं मिल रहा है। –

1

किस प्रकार का सेट? क्या सभी श्रोताओं को बराबर और हैशकोड लागू करना चाहिए ताकि एक हैश सेट का उपयोग किया जा सके, या एक पहचान हैश सेट करेगा? क्या जटिलता के लायक सूची में श्रोता जोड़ने का उपयोग मामला है? क्या उनके हैंडलरों को कॉल के दौरान श्रोताओं को जोड़ने या हटाने के खिलाफ सेट को सुरक्षित बनाने के लिए एक तंत्र आसान है?

कुछ प्रदर्शन अंतर हो सकते हैं, लेकिन निश्चित रूप से अधिक जटिल डिज़ाइन हैं, और यह एप्लिकेशन को छोड़ने के बजाय लाइब्रेरी में एकाधिक ऐड-एकाधिक हटाने का निर्णय देता है।

+0

मुझे लगता है कि एक पहचान हैश सेट उपयुक्त होगा। लेकिन दिया गया, बॉक्स के बाहर उपलब्ध "CopyOnWriteIdentityHashSet" नहीं है, इसलिए सामान्य सूची मुहावरे का उपयोग सही अंत परिणाम प्राप्त करने में बस आसान हो सकता है। –

+0

लेकिन: वास्तव में जावा 6 में एक CopyOnWriteArraySet है, जो थ्रेड-सुरक्षित है ("इटरेटर के माध्यम से ट्रैवर्सल तेज़ है और अन्य धागे से हस्तक्षेप नहीं कर सकता है।")। Http://java.sun.com/javase/6/docs/technotes/guides/collections/changes5.html के अनुसार "यह कार्यान्वयन ईवेंट-हैंडलर सूचियों को बनाए रखने के लिए उपयुक्त है जो डुप्लिकेट को रोकना चाहिए।" –

+1

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

0

आप बिल्कुल सही हैं। श्रोताओं को सेट में जोड़ा जाना चाहिए। जैसा कि आपने कहा था, श्रोताओं को एक से अधिक बार जोड़ना कोई समझ नहीं आता है। यदि आप सेट का उपयोग करते हैं तो इसके अलावा श्रोताओं के आदेश पर भरोसा नहीं किया जाएगा। और यह सबसे महत्वपूर्ण बात है: यदि आप सॉफ्टवेयर विकास को गंभीर बनाते हैं और हमें बेहतर डिजाइन करने के लिए नेतृत्व करने के लिए हर एक सिद्धांत के बारे में कोई भरोसा नहीं करना चाहिए: अलगाव, स्वतंत्रता, जिम्मेदारी।

यहां वर्णित हर पहलू (बहु थ्रेडिंग, प्रदर्शन, ...) को पहले विचार में खुद को अधीन रखना है, लेकिन यदि आपके अच्छे कारण हैं तो इसे तोड़ दिया जा सकता है। और मेरा मतलब बहुत अच्छे कारण हैं।

वैसे: श्रोता को खुद को हटाने के लिए यह एक बुरा अभ्यास है। जोड़ना और निकालना सममित होना चाहिए। इसलिए श्रोता को उस ऑब्जेक्ट के माध्यम से हटा दिया जाना चाहिए जो इसे पंजीकृत करता है। यदि आपके पास बहुत सारे श्रोताओं शामिल हैं तो आप जल्द ही अटक जाएंगे।

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