2013-08-20 6 views
23

मैं इस में कई बार की तरह कोड को देखा है:कारण - सूची सूची = नया ArrayList();

List<String> list = new ArrayList<String>();

क्यों लोगों उत्पन्न वस्तु के प्रकार के बजाय ArrayList (और अन्य वर्गों) की मूल लेते हैं?

क्या इससे कम प्रदर्शन होता है? या किसी को ऐसा क्यों करना चाहिए?

+9

यह "प्रदर्शन" पर निर्धारण के साथ क्या है से लिया? 90% समय, यह कोड लिखने के * कम से कम महत्वपूर्ण * पहलू के बारे में है! –

+2

http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – kiheru

+0

आप इसे भी देख सकते हैं: http://stackoverflow.com/questions/ 1745 9 553/क्यों-कुछ-लोग-उपयोग-सूची-आधार-वर्ग-से-तत्काल-एक-नई-सरणीसूची – Marc

उत्तर

36

जब कोई इस तरह कोड लिखते हैं, वह/वह एक बुनियादी OO डिजाइन सिद्धांत है जो कहते हैं पालन करने के लिए कोशिश कर रहा है -

कार्यक्रम एक इंटरफेस करने के लिए, एक ठोस कार्यान्वयन

मैं नहीं one of my blog posts में इस सिद्धांत को समझाया। Class Inheritance VS Interface Inheritance अनुभाग में देखें।

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

public void DoSomeStuff(Super s) { 
    s.someMethod(); 
} 

और इस विधि के लिए एक कॉल - -

निम्न विधि पर विचार करें

DoSomeStuff(new Sub()); 

अब, अगर तुम कभी someMethod अंदर तर्क बदलने की जरूरत है, तो आप इसे की घोषणा के द्वारा आसानी से कर सकते Super का एक नया उप प्रकार, NewSubType कहें, और उस कार्यान्वयन के अंदर तर्क बदलना। इस तरह, आपको उस विधि का उपयोग करने वाले अन्य मौजूदा कोड को कभी भी स्पर्श नहीं करना पड़ेगा।आप अभी भी निम्नलिखित तरीके से अपने DoSomeStuff विधि का उपयोग करने में सक्षम हो जाएगा -

DoSomeStuff(new NewSubType()); 

था आप DoSomeStuff के पैरामीटर घोषित Sub की हो, तो आप तो इसके कार्यान्वयन भी परिवर्तन होगा -

DoSomeStuff(NewSubType s) { 
    s.someMethod(); 
} 

और यह कई अन्य स्थानों पर चेन/बबल भी हो सकता है।

आपके संग्रह उदाहरण के संदर्भ में, यह आपको सूची कार्यान्वयन को बदलने देता है जो एक चर के बिना परेशानी के संकेत दे रहा है। ArrayList के स्थान पर आप आसानी से LinkedList का उपयोग कर सकते हैं।

+2

"एक ठोस कार्यान्वयन के लिए एक इंटरफेस के लिए कार्यक्रम" एक अच्छी सलाह है। हालांकि, यह वास्तव में 'सूची सूची = नई ArrayList ();' क्योंकि ए) करने के लिए वास्तव में एक तर्क नहीं है) यह कोड अभी भी निर्माता के कारण ArrayList से जुड़ा हुआ है और बी) यह एपीआई डिज़ाइन के बारे में अधिक है और निजी कार्यान्वयन नहीं है। यह उन चीजों में से एक है जो आप शुरुआत से सीखते हैं जो वास्तव में उचित नहीं है। अक्सर कार्यान्वयन कुछ niceties प्रदान करता है जो आप कभी नहीं देखेंगे अगर आप इंटरफ़ेस का उपयोग करने पर जोर देते हैं। जवाब अभी भी अच्छा है। (+1) – atamanroman

+1

लेकिन, उनका तर्क अभी भी खड़ा है। आप तर्क को बदलकर कार्यक्षमता को स्वैप कर सकते हैं। यह निर्भरता इंजेक्शन, ढीली युग्मन और प्रतिस्थापन जैसी कई अच्छी कोड सुविधाओं का समर्थन करता है। – christopher

+0

@atamanroman: उस सिद्धांत का एक परिणाम आपको अपने _interfaces_ के संदर्भ में ठोस उदाहरणों को संदर्भित करने के लिए प्रोत्साहित करता है। यही कारण है कि मुझे लगता है कि यह यहां प्रासंगिक है। –

2
List<String> list = new ArrayList<String>(); 

संग्रह ढांचे List में जबकि ArrayList कार्यान्वयन है एक अंतरफलक है। मुख्य कारण यह है कि आप इंटरफ़ेस के विशिष्ट implementation से अपने कोड को डीक्यूपल करना चाहते हैं, यदि भविष्य में List के किसी अन्य कार्यान्वयन में जाना चाहते हैं तो यह सहायक होगा।

11

इसका मतलब है कि आपको लगता है कि List इंटरफ़ेस लागू करता है, के रूप में एक कठोर मॉडल है कि केवल ArrayList उपयोग कर सकते हैं बनाने के लिए विरोध कुछ भी साथ किसी भी बिंदु पर list के प्रकार के बाहर स्वैप कर सकते हैं। उदाहरण के लिए:

private List<String> list; 

public SomeConstructor() 
{ 
    // At this point, you can make it any type of object you want. 
    list = new ArrayList<String>(); 
    list = new LinkedList<String>(); 
    list = new AttributeList<String>(); 
} 

यह abstract अपने कोड होगा विवरण list है क्या सही ऑब्जेक्ट प्रकार की तरह से दूर list वस्तु का उपयोग करता है,। इसे जानने की जरूरत है कि इसमें add विधि आदि है। इसे Loose Coupling कहा जाता है।

3

क्योंकि किसी विधि को यह नहीं पता है कि आप किस सूची-कार्यान्वयन का उपयोग करते हैं।

एक विधि को सिर्फ यह जानने की जरूरत है कि यह एक सूची है।

विधि अभी भी उपयोग की जा सकती है।

हमेशा एक ठोस कार्यान्वयन के लिए एक इंटरफ़ेस पर प्रोग्राम। (इस मामले में सूची)

3

आम तौर पर इंटरफ़ेस वर्ग (List इस मामले में) के साथ काम करना पसंद किया जाता है ताकि आवश्यकताओं को बदलने पर किसी भी सूची कार्यान्वयन को बाद में न्यूनतम झगड़े के साथ प्रतिस्थापित किया जा सके।

हालांकि ArrayList संभवतः List इंटरफ़ेस पर नहीं होने वाली कुछ विधियों का समर्थन करता है, यह घोषणा यह स्पष्ट करती है कि उन अतिरिक्त विधियां उस मामले में प्रासंगिक नहीं हैं।

8

जब आप लिखें:

List<String> list = new ArrayList<String>();

तो क्या आप वाकई केवल इंटरफ़ेसList की कार्यक्षमता का उपयोग करेंगे रहे हैं।
(ArrayList लागू List, इसलिए List अधिक flexibl है)। इसका उपयोग करके, आप ArrayList को भविष्य में अन्य प्रकारों में बदल सकते हैं (जैसे LinkedList ..)।

5

चीजों को क्रमबद्ध करने के लिए:

अधिक लचीलेपन के लिए आप इंटरफ़ेस List आरंभ:

तो तुम सब ArrayList उपयोग List केवल जरूरत नहीं है यदि।

आप कुछ लिख सकते हैं जैसे: List<String> = Arrays.asList("aa", "bb","cc")

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

enter image description here

here

+1

स्रोत खुशी :) –

+2

http://www.wilsonmar.com/1arrays.htm –

+0

@ मैक्सिम शौस्टिन: अच्छी तस्वीर! क्या इसका मतलब यह है कि मुझे "सार तत्व" को सभी मानचित्र-संग्रह-वस्तुओं के संदर्भ के रूप में लेना चाहिए? – codepleb

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