2013-08-28 20 views
6

नीचे दो तरह से कैसे ArrayList बनाने के लिए कर रहे हैं:ArrayList को ठीक से कैसे बनाया जाए?

List<String/*or other object*/> arrList = new ArrayList();//Imports List, ArrayList 
ArrayList<String/*or other object*/> arrList = new ArrayList();//Imports just ArrayList 

क्या अंतर है? किस विधि का उपयोग किया जाना चाहिए?

+3

पूर्व आपको _abstraction_ का लाभ उठाने देता है। – rocketboy

+2

स्पष्ट उत्तर के अलावा, आपको आयात के बारे में चिंता नहीं करनी चाहिए। वे रनटाइम पर प्रदर्शन को प्रभावित नहीं करते हैं। –

+1

[क्या-क्या-यह-मतलब-टू-प्रोग्राम-टू-ए-इंटरफेस] पर एक नज़र डालें [http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to -न-इंटरफ़ेस) – Pshemo

उत्तर

6

प्रथम श्रेणी कक्षा (कक्षा में गुणों की घोषणा) के सार्वजनिक इंटरफ़ेस के लिए अनुशंसित किया गया है। यह एक प्रसिद्ध सलाह है कि आपको एक ठोस कार्यान्वयन के लिए एक इंटरफ़ेस के लिए प्रोग्राम करना चाहिए (यह Design Patterns में कहा गया है) - आपके द्वारा आयात किए जाने वाले वर्गों की संख्या कोड और अच्छी डिज़ाइन की गुणवत्ता के साथ बहुत कम है।

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

ऐसे मामले हैं जब कंक्रीट कक्षाओं की घोषणा करना और उपयोग करना ठीक है, हालांकि (उदाहरण के लिए, प्रदर्शन में थोड़ा टक्कर के लिए)। लेकिन कक्षा के सार्वजनिक इंटरफेस को जब भी संभव हो इंटरफेस का उपयोग करना चाहिए, इससे भविष्य में बदलावों को लागू करने में आसान बना दिया जाएगा।

+0

जब मैंने प्रश्न पढ़ा, तो मुझे यकीन था कि सेकंड के भीतर बहुत से लोग इस या एक समान उत्तर दे रहे हैं (यदि कोई नहीं था, तो मेरे पास होगा;))। हालांकि, एक प्रोग्रामर के रूप में 15 वर्षों में, आपके द्वारा वर्णित नियम को अनदेखा करके कभी भी वास्तविक वास्तविक समस्या नहीं आ रही है, और न ही मैंने इसका पालन करके कभी भी लाभ प्राप्त किया है। तो क्या आपके पास अपने प्रोग्रामिंग लाइव से एक उदाहरण है, जो वास्तव में हर किसी को कंक्रीट कक्षाओं के खिलाफ कभी भी प्रोग्राम नहीं करने के लिए प्रोत्साहित करता है? –

+0

@KaiHuppmann प्रदर्शन कारणों से कंक्रीट वर्गों का कहना है और उपयोग करना ठीक है (कहें, एक विधि में स्थानीय चर के रूप में)। लेकिन एक वर्ग के सार्वजनिक इंटरफ़ेस को इंटरफेस के संदर्भ में उजागर किया जाना चाहिए। उसने मुझे अच्छी तरह से सेवा दी है :) –

+0

@KaiHuppmann अच्छी तरह से वे सभी गलत हैं :) – ZhongYu

1

इसे पहले उदाहरण की तरह करके, आप List इंटरफ़ेस को लागू करने वाले किसी भी डेटास्ट्रक्चर को सूची असाइन करने में सक्षम हैं।

यह आपके प्रोग्राम में flexibility जोड़ता है, क्योंकि आप आसानी से कार्यान्वयन को बदलने में सक्षम हैं।

2

पहले तरीके

दूसरा एक कार्यान्वयन के लिए कोडिंग कहा जाता है इंटरफेस करने कोडिंग कहा जाता है।

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

0

सूची एक इंटरफ़ेस है। ArrayList एक वर्ग है जो सूची इंटरफ़ेस लागू करता है।

0

अंतर यह है कि यह सूची वापस करने वाले तरीकों के कॉलर्स से विशिष्ट कार्यान्वयन को छुपाता है। यह आम तौर पर अच्छा अभ्यास है - यदि आप List लौटाते हैं तो आपको बाद में अंतर्निहित कार्यान्वयन को बदलने की आजादी है, बिना किसी अन्य कोड के समूह को बदलने के एक लहर प्रभाव के बारे में चिंता किए बिना। यदि आपको List.get(index) जैसी सूची-विशिष्ट चीजों की आवश्यकता नहीं है तो आप Collection<String> col = new ArrayList<String();

1

पहले व्यक्ति को कंक्रीट क्लास (ऐरेलिस्ट) को बदलने के लिए आपको छोड़ देता है यदि आप बाद में इसका एक और कार्यान्वयन महसूस करते हैं सूची आपके काम के लिए बेहतर अनुकूल है। आपको केवल उस पंक्ति को बदलने की आवश्यकता होगी, क्योंकि arrList का उपयोग करने वाले अन्य स्थानों की सूची जो लागू होती है, ArrayList नहीं।

दूसरे संस्करण के साथ

, यदि आप वह परिवर्तन करने का निर्णय, तो आप हर जगह है कि एक ArrayList.

जैसा कि ऊपर उल्लेख उम्मीद बदलने के लिए होगा, इस इंटरफेस के लिए कोडिंग कहा जाता है।

0

यदि आप ArrayList बनाना चाहते हैं, तो केवल दूसरा सही है।पहले List बनाता है, जिसे ArrayList वर्ग द्वारा कार्यान्वित किया जाता है, लेकिन वे कई परिस्थितियों में अंतर-परिवर्तनीय नहीं हैं। This question का एक बहुत अच्छा जवाब है।

+1

करने के लिए लगने वाले समय तक उबाल जाता है, पहले विकल्प का उपयोग करके 'ऐरेलिस्ट' बनाना पूरी तरह से संभव है। – RaptorDotCpp

0

लोकप्रिय राय के विपरीत, मैं कहना है कि हम 2 प्रपत्र

ArrayList<X> list = new ArrayList<>(); 

यह पंक्ति एक कार्यान्वयन विस्तार है का उपयोग करना चाहिए; हमें अपने कार्यान्वयन विवरण में जितना संभव हो उतना विशिष्ट होना चाहिए।

यह एक सार्वजनिक एपीआई का हिस्सा नहीं है जिसे सारणित किया जाना चाहिए; "इंटरफेस के खिलाफ कोड" के लिए तर्क यहां लागू नहीं होते हैं।

0

मैं देख सकता है कि कई लोगों इंटरफ़ेस का उपयोग कर की सिफारिश, मैं कहेंगे निम्नलिखित:

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

  • अधिकतर मामलों में, जब आप बहुत अधिक जानकारी का खुलासा करने से बच सकते हैं, तो उपयोग करें इंटरफेस।

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