जावा में, एपीआई में कंक्रीट कक्षाओं के बजाय इंटरफ़ेस प्रकारों का उपयोग करना अच्छा है।
आपकी समस्या यह है कि आप उपयोग कर रहे हैं 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))
जो कि सबलिस्ट की कॉपी बनाकर काम करता है। यह सामान्य अर्थों में एक टुकड़ा नहीं है। इसके अलावा, अगर सबलिस्ट बड़ा है, तो कॉपी बनाना महंगा हो जाएगा।
आप एपीआई से विवश कर रहे हैं कि आप बदल नहीं सकते , ऐसे आपको लगता है कि करने के लिए है की घोषणा inputAएक के रूप में ArrayList, आप में से एक कस्टम उपवर्ग को लागू करने में सक्षम हो सकता ArrayListहै, जिसमें subListविधि का एक उपवर्ग रिटर्न ArrayList। तथापि:
- यह डिजाइन, कार्यान्वयन और परीक्षण करने के लिए बहुत काम आएगा।
- आपने अब अपने कोड आधार में महत्वपूर्ण नई कक्षा जोड़ी है, संभवतः अनिर्दिष्ट पहलुओं पर निर्भरता के साथ (और इसलिए "परिवर्तन के अधीन")
ArrayListवर्ग के पहलू ।
- आपको अपने कोडबेस में प्रासंगिक स्थानों को बदलने की आवश्यकता होगी जहां आप
ArrayListइसके बजाय अपने उपवर्ग के उदाहरण बनाने के लिए उदाहरण बना रहे हैं ।
"सरणी की प्रतिलिपि बनाएँ" समाधान अधिक व्यावहारिक है ... ध्यान में रखते हुए कि ये सही स्लाइस नहीं हैं।
ArrayList? मुझे लगता है कि आपको यह समझने में थोड़ी कमी हो सकती है कि इंटरफ़ेस कैसे काम करता है क्योंकिListऔरArrayList"असंगत" नहीं हैं -ArrayListलागू होते हैंList, औरListसंभवतः आपके लिए आवश्यक सभी आवश्यक तरीके शामिल हैं।