2012-07-20 17 views
6

तो, के रूप में मैं समझता हूँ, एक हमेशा एक अंतरफलक के लिए कार्यक्रम होना चाहिए, के रूप में:प्रोग्रामिंग - बाद में कलाकारों से परहेज

List<Integer> list = new LinkedList<Integer>(); 

तो, बाद में मेरे कार्यक्रम में मेरे पास है:

public List<Integer> getIntegers() { 
    return list; 
} 

public void processIntegers() { 
    // I need an arraylist here 
    ArrayList<Integer> list = (ArrayList<Integer>) getIntegers(); // can I do this better, without a cast? 
} 

क्या मैं यहां एक बेहतर पैटर्न का पालन कर सकता हूं या किसी भी तरह कास्ट से बचने के लिए कुछ कर सकता हूं? इस परिदृश्य में कास्टिंग बहुत बदसूरत लगता है।

धन्यवाद।

+1

मैं यह भी पूछूंगा कि यह बेहतर क्यों है, फिर एक सरणीसूची का उपयोग करके, अगर अंत में एक कास्ट अपरिहार्य है। – dontcare

+0

@ डॉटकेयर तो आप एक सामान्य फ़ंक्शन में पूर्णांक की इस सूची को पास कर सकते हैं जो केवल एक सूची स्वीकार करता है, विशेष रूप से एक सरणीसूची नहीं। – jn1kk

+0

आपको कम से कम विशिष्ट प्रकार के कार्यक्रम को प्रोग्राम करना चाहिए जिससे आप दूर हो सकते हैं और आगे नहीं। – plasma147

उत्तर

7

सबसे पहले अपने आप से एक प्रश्न पूछें: आपको ArrayList क्यों चाहिए? इसके अलावा, क्या आपके एपीआई देखभाल के ग्राहकों को इसके बारे में चाहिए? आप कुछ विकल्प हैं:

  • getIntegers() वापसी ArrayList<Integer> बनाते हैं। यह कोई अपराध नहीं है

  • कम मजबूत इंटरफ़ेस आवश्यकता पर विचार करें, उदा।

    ArrayList<Integer> list = new ArrayList<Integer>(getIntegers()); 
    

    instanceof ऑपरेटर का उपयोग अनावश्यक नकल से बचने के लिए अगर getIntegers() पहले से ही एक ArrayList है पर विचार करें: एक आम सहमति

  • एक रक्षात्मक कॉपी बनाए ताकि आप किसी भी List उपभोग कर सकते हैं के रूप में AbstractList

दूसरे शब्दों में - इस आवश्यकताओं को अपनी आवश्यकताओं और सुरुचिपूर्ण तरीके से टालने का कोई तरीका नहीं है।

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