Best Practices: Always return a ____, never a ____ की भावना में, मुझे अपने आने वाले migration from JDK1.4.2 to JDK5 and more में एक समान प्रश्न का सामना करना पड़ता है। (हाँ, मैं , JDK1.4.2 is EOL! ;-)) जानता हूं।एपीआई जावा 5 और अधिक: क्या मुझे एक सरणी या संग्रह वापस करना चाहिए?
एक संग्रह लौटने कार्यों के लिए(जो सरल property collections नहीं हैं), मैं हमेशा पसंद करते हैं (JDK1.4.2 में) एक सामान्य सूची के बजाय एक सरणी लौटने, क्योंकि:
- यह लौटने प्रकार लागू करता है (
MyObject[]
वस्तुओं की सूची, के बजाय और अधिक प्रकार सुरक्षित एक स्थिर पर - 'संकलन' के रूप में - स्तर) - यह पता चलता है एक 'केवल पढ़ने के लिए' लौटे संग्रह करने के लिए चरित्र (यह है एक हाथ जोड़ने के लिए और अधिक जटिल संग्रह को ध्यान दें, भले ही यह सी # में 'केवल पढ़ने के लिए' कीवर्ड के रूप में कठोर न हो)। यह
हुए कहा कि यह सरणी के अंदर संदर्भ अभी भी संशोधित किया जा सकता क्योंकि 'अडिग' है के रूप में ही नहीं है ..., मैं हमेशा बना सकता हूँ इस सरणी लौटे (मैं किसी भी संपर्क में न आएं ' आंतरिक 'सरणी)
अब, जेडीके 5 और अधिक में, मैं List<MyObject>
का उपयोग कर सकता हूं यदि मैं चाहता हूं।
जावा 5 में कोडिंग करते समय सूची या Collection<MyObject>
की बजाय MyObject[]
वापस करने का चयन करने के अच्छे कारण क्या हैं?
- एक को लागू रीड-ओनली लौटे संग्रह पर विशेषता:
बोनस, यदि
Collection<MyObject>
प्रयोग किया जाता है, यह संभव है? (add()
याremove()
संभव) - लौटे हुए संग्रह में एक अपरिवर्तनीय पहलू को लागू करता है? (यहां तक कि उस संग्रह के संदर्भ भी संशोधित नहीं किए जा सकते हैं)
पीएस: JavaGenericFAQ में काफी कुछ नहीं था।
धन्यवाद! अभी के लिए +1 (मैं अन्य उत्तरों के लिए थोड़ा इंतजार करूँगा)। आप बता सकते हैं कि मैंने अभी तक जेडीके 6 जावाडोक को गंभीरता से नहीं पढ़ा है ...;) – VonC
"Arrays और जेनरिक बहुत अच्छी तरह से मिश्रण नहीं करते हैं। इसलिए, यदि आप जेनेरिक का लाभ लेना चाहते हैं, तो आपको आमतौर पर सरणी से बचना चाहिए।" -> Urg? क्या आप इस भाग को समझा सकते हैं? मेरे सरणी मेरे जेनेरिक के साथ अच्छी तरह मिलाते हैं ... – Nicolas
आप सामान्य रूप से एक सरणी नहीं बना सकते हैं। उदाहरण के लिए, यदि टी एक सामान्य प्रकार है तो "नया टी [0]" संकलित नहीं होता है। आपको कुछ ऐसा करना होगा "(टी []) नया ऑब्जेक्ट [0]", जो एक अनचेक कास्ट चेतावनी उत्पन्न करता है। इसी कारण से, आप चेतावनी के बिना varargs के साथ सामान्य प्रकार का उपयोग नहीं कर सकते हैं। –