जावा में, एपीआई में कंक्रीट कक्षाओं के बजाय इंटरफ़ेस प्रकारों का उपयोग करना अच्छा है।
आपकी समस्या यह है कि आप उपयोग कर रहे हैं 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
संभवतः आपके लिए आवश्यक सभी आवश्यक तरीके शामिल हैं।