जावा में, एपीआई में कंक्रीट कक्षाओं के बजाय इंटरफ़ेस प्रकारों का उपयोग करना अच्छा अभ्यास है।
आपकी समस्या यह है कि आप ArrayList
(शायद कई स्थानों पर) का उपयोग कर रहे हैं जहां आपको वास्तव में List
का उपयोग करना चाहिए। नतीजतन आपने अपने लिए एक अनावश्यक बाधा के साथ समस्याएं पैदा कीं कि सूची ArrayList
है।
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
आपका प्रस्तावित समस्या के लिए "समाधान" था/यह है::
यह वही अपने कोड की तरह दिखना चाहिए है
new ArrayList(input.subList(0, input.size()/2))
कि की एक प्रतिलिपि बनाकर काम करता है उपन्यासकार यह सामान्य अर्थ में एक टुकड़ा नहीं है। इसके अलावा, अगर उपन्यास बड़ा है, तो प्रतिलिपि बनाना महंगा होगा।
आप API शामिल हैं नहीं बदल सकते हैं, तो आप करने के लिए है ऐसी है कि एक ArrayList
रूप inputA
घोषित, आप ArrayList
के एक कस्टम उपवर्ग को लागू करने में सक्षम हो सकता से विवश कर रहे हैं, जिसमें subList
विधि रिटर्न ArrayList
का उप-वर्ग। हालांकि:
- यह डिजाइन, कार्यान्वयन और परीक्षण के लिए बहुत काम करेगा।
- आपने अब
ArrayList
कक्षा के पहलुओं पर अनियंत्रित पहलुओं (और इसलिए "परिवर्तन के अधीन") पर निर्भरताओं के साथ अपने कोड आधार पर महत्वपूर्ण नई कक्षा को जोड़ा है।
- आपको अपने कोडबेस में प्रासंगिक स्थानों को बदलने की आवश्यकता होगी जहां आप अपने उप-वर्ग के उदाहरण बनाने के लिए
ArrayList
उदाहरण बना रहे हैं।
"सरणी की प्रतिलिपि" समाधान अधिक व्यावहारिक है ... यह ध्यान में रखते हुए कि ये सही स्लाइस नहीं हैं।
स्रोत
2009-09-26 12:34:57
आप 'ऐरेलिस्ट' का उपयोग करने का आग्रह क्यों करते हैं? मुझे लगता है कि आप समझने में थोड़ा सा कमी महसूस कर सकते हैं कि इंटरफेस कैसे काम करते हैं क्योंकि 'सूची' और' ऐरेलिस्ट 'असंगत नहीं हैं-' एर्रेलिस्ट '' सूची 'लागू करता है, और' सूची' में शायद आपको आवश्यक सभी आवश्यक विधियां शामिल हैं। – Bombe
मैं ArrayList का उपयोग करने पर जोर देता हूं क्योंकि यह एक कठोर विधि प्रोटोटाइप के साथ एक अभिप्राय प्रश्न है। मुझे स्पष्ट रूप से समझ की कमी है, क्योंकि उपसूची को एक सूची प्रकार वापस करना है, और फिर भी मैं लौटाई गई सूची को ArrayList में नहीं डाल सकता। तो आप मुझे आदमी बताओ .. –
यह पूरी तरह से संभव है कि उसे 'ऐरेलिस्ट' की आवश्यकता है क्योंकि उसके बाद उसे एक विधि को कॉल करने की आवश्यकता है जो 'ऐरेलिस्ट' स्वीकार करता है। तर्कसंगत रूप से ऐसी विधि खराब रूप से डिज़ाइन की गई है और इसके बजाय 'सूची' स्वीकार करनी चाहिए, लेकिन ऐसी स्थितियां न केवल साक्षात्कार के प्रश्नों में उत्पन्न हो सकती हैं बल्कि दूसरों द्वारा लिखे गए कोड में भी हो सकती हैं कि कोई भी नहीं जा सकता और बदल सकता है। सहकर्मियों और पुस्तकालय हमेशा सही नहीं होते हैं। – Gravity