2010-02-02 8 views
18

मेरे पास विधि List<Foo> getFoos() है जो दूरस्थ सर्वर से डेटा प्राप्त करता है और इसे लौटाता है।क्या यह अप्रचलित सूची लौटने के लिए स्वीकार्य है या क्या मुझे सरणी वापस करनी चाहिए?

बेशक, उपयोगकर्ता को सूची के आइटमों की संख्या में बदलाव नहीं करना चाहिए क्योंकि वह डेटा को सर्वर पर डेटा के साथ सिंक्रनाइज़ नहीं करेगा (और यदि वह आइटमों की संख्या बदलना चाहता है तो उसके पास addFoo() जैसे विशेष तरीके हैं)।

पहला दृष्टिकोण सरणी वापस करने और Foo[] getFoos() पर विधि के हस्ताक्षर को बदलने के लिए था। लेकिन यह जावा में अधिक आम है और संग्रह के साथ काम करने के लिए उपयोगकर्ता के लिए अधिक सुविधाजनक है इसलिए मैंने List<Foo> getFoos() पर हस्ताक्षर बदल दिया। इस विधि हमेशा

Collections.unmodifiableList (originalList)

तो देता है, जब उपयोगकर्ता सूची वह RuntimeException मिल जाएगा बदलने की कोशिश।

क्या इसी तरह के मामलों में एपीआई डिज़ाइन के बारे में कोई सिफारिशें हैं?

उत्तर

23

Collections.unmodifiableList पूरी तरह स्वीकार्य है और तेज़ी से होना चाहिए (सरणी बनाने की कोई आवश्यकता नहीं है)।

संपादित करें - एपीआई डिज़ाइन के संदर्भ में, आपको बस अपना जावाडॉक स्पष्ट करना चाहिए! जो लोग अपने डॉक्टर को पढ़ने के बिना किसी विधि का उपयोग करते हैं, वे आश्चर्यचकित हैं: पी

+0

मुझे और अधिक परवाह है कि क्या यह उपयोगकर्ताओं को भ्रमित करता है और उन्हें लगता है कि वे सूची को संशोधित कर सकते हैं और सभी सिंक्रनाइज़ेशन सामग्री स्वचालित रूप से की जाएगी (सर्वर का मतलब है सिंक)। – Roman

+1

बेशक, पहले RuntimeException के बाद सभी उलझन में उपयोगकर्ता निश्चित रूप से समझेंगे कि वे इसे इतना आसान नहीं कर सकते हैं :) – Roman

+0

@Roman आपके दस्तावेज़ में आपको केवल एक अपरिहार्य सूची लौटा दी जा रही है। – Poindexter

0

यदि आप किसी मौजूदा ऑब्जेक्ट से कस्टम, विशेष संपत्ति चाहते हैं, या इस मामले में सूचीबद्ध करें तो इसे विस्तारित करने या रखने का प्रयास क्यों न करें और प्रासंगिक एक्सेसर्स को फेंकने का प्रयास न करें एक अपवाद?

कारण यह है कि आप सूची में कुछ अन्य क्लाइंट ऑब्जेक्ट्स को संशोधित करने की अनुमति दे सकते हैं; यह इस बात पर निर्भर करता है कि आवेदन स्तर के करीब डेटा लौटाया गया डेटा है।

+1

मुझे नहीं लगता कि विस्तारित सूची केवल अनमोडिफाइडलिस्ट का उपयोग करने से बेहतर दृष्टिकोण है। यह अधिक काम है और यह संभव है कि आपका स्वयं का कार्यान्वयन जावा देवों द्वारा बनाए गए जैसा उतना अच्छा न हो। –

+0

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

2

मैं यह भी कहूंगा कि यह पूरी तरह स्वीकार्य है और एक सरणी लौटने से कहीं बेहतर है (जो some सुझाव को पूरी तरह से बहिष्कृत प्रकार के रूप में माना जाना चाहिए)। यदि आप एपीआई में इसके बारे में और अधिक स्पष्ट होना चाहते हैं, तो आप Google Collections से ImmutableList लौटने पर विचार कर सकते हैं।

+0

हाँ, अपरिवर्तनीय * संग्रह इस तरह की चीज़ के लिए बिल्कुल सही हैं। – ColinD

+1

मुझे यकीन नहीं है कि इसे एपीआई में तीसरे पक्ष के पुस्तकालयों से कक्षाओं का उपयोग करने के लिए एक अच्छा अभ्यास कहा जा सकता है (भले ही यह Google द्वारा लिखा गया हो)। – Roman

+0

यदि उस पुस्तकालय ने जेडीके की तरह अनन्त पिछड़ा-संगतता का सार्वजनिक प्रतिज्ञा नहीं की है, तो आप सही होंगे। हालांकि Google संग्रह के मामले में, आप सुरक्षित हैं। –

1

मैं वस्तुतः नग्न सूची या सरणी वापस नहीं लौटाता हूं। यदि आपके पास कुछ संग्रह है, तो लगभग हमेशा इसके साथ जुड़े कुछ कोड हैं जो उस संग्रह का हिस्सा होना चाहिए। संग्रह के आस-पास एक वर्ग नहीं होने के कारण आप उस कोड को विभिन्न स्थानों पर डुप्लिकेट करने के लिए मजबूर कर रहे हैं जहां संग्रह का उपयोग किया जाता है।

संग्रह, आमतौर पर एक चर या दो संग्रह संग्रह से जुड़े होते हैं। जब भी आप संग्रह पास करते हैं तो आप पाएंगे कि आप उन्हें पास करेंगे। ये व्यवसाय तर्क वर्ग में हैं जो संग्रह को लपेटता है।

0

यदि आपके पास पूर्ण स्वतंत्रता है और ऐसा लगता है कि आप करते हैं, तो आपको सरणी या सूची के बीच चयन नहीं करना चाहिए, बल्कि एक इटरेटर वापस करना होगा। इससे आपको मदद मिलेगी यदि आपको विशिष्टता की आवश्यकता है ताकि सेट को लौटने की बजाय - अभी भी इटरेटर वापस कर दें।

+2

क्या आप वास्तव में सोचते हैं कि एक इटेटरेटर प्राप्त करना उपयोगकर्ता या सूची या सेट प्राप्त करने से अधिक सुविधाजनक है ?? (टिप: क्या होगा यदि उसे दो बार फिर से भरने की ज़रूरत है? क्या होगा यदि उसे आकार प्राप्त करने की ज़रूरत है? क्या होगा यदि उसे ठोस तत्वों के बजाय पूरे संग्रह के साथ काम करने की ज़रूरत है यानी xxxAll() ... जैसे ऑपरेशन करें। – Roman

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

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