2011-10-31 4 views
8

मैं एक API को कार्यान्वित कर रहा हूँ एक एक तरीका है जिसके तुम कहाँ कार्यक्रमकिसी सरणी में एक varargs सूची को कब पसंद करते हैं?

public void importFrom(String... paths) { 

} 

से संसाधनों मैं विधि बुला उपयोगकर्ता के लिए संभव के रूप में सुविधाजनक बनाने के लिए उपयोग कर रहा हूँ varargs पढ़ता रास्तों में से एक सूची से पारित है, जैसे

obj.importFrom("/foo", "/foo/bar); 

क्या यह varargs का उचित उपयोग है? या एक सरणी में बेहतर गुजर रहा है?

+2

आप अभी भी एक varargs विधि में एक सरणी पास कर सकते हैं, यह वही व्यवहार करेगा। –

उत्तर

7

आपके मामले में varargs बस ठीक है। आपको वास्तव में उन पथों की एक सरणी बनाने की आवश्यकता नहीं है जिन्हें आप आयात करेंगे क्योंकि आपके पास importFrom विधि के साथ उन्हें पास करने के अलावा इन पथों के साथ कुछ भी नहीं करना है।

varargs कार्यक्षमता आपको एक-एक विधि के मूल्यों को संग्रहित करने के उद्देश्य से पूरी तरह से सरणी बनाने के लिए सहेजती है, जो आप यहां दिखाई देते हैं।

BTW, आप अभी भी एक सरणी में पारित कर सकते हैं अगर आप

public class VarargsDemo { 
    public static void f(String... args) { 
     for (String s: args) { 
      System.out.println(s); 
     } 
    } 
    public static void main(String[] args) { 
     String[] english = new String[]{"one", "two", "three"}; 
     f(english); 
     f("uno", "dos", "tres"); 
    } 
} 

करना चाहते हैं क्योंकि व्यवहार में ही है, फर्क एक (शायद छोटे) क्या आप विधि चाहते हैं के प्रश्न के नीचे आता है "कहना" के लिए हस्ताक्षर। जब आप एक स्पष्ट सरणी पैरामीटर लेने के लिए कोई विधि घोषित करते हैं, तो यह लगभग है जैसे आप तनाव देना चाहते हैं कि आप किसी सरणी ऑब्जेक्ट पर काम करना चाहते हैं, जो विधि के बाहर परिभाषित किया गया है और विधि के बाहर इसका अस्तित्व और महत्व है, और एक जिसमें, शायद, अनुक्रमण सूचकांक जैसे संचालन। Varargs के साथ विधि घोषित करते समय, जैसा कि आप कह रहे हैं "बस मुझे वस्तुओं का एक गुच्छा दें"।

फिर फिर, यह सच नहीं होना चाहिए; JVM अंतर को नहीं जानता है, यह देखता है कि रन टाइम पर एक सरणी है। कई प्रोग्रामर विधि हस्ताक्षर के इरादे पर विभाजित बाल परेशान नहीं करेंगे। Varargs कॉल को सुविधाजनक बनाने के बारे में सब कुछ है।

उस ने कहा, मुख्य सीमा varargs की सीमा यह है कि ऐसा पैरामीटर विधि का अंतिम भाग होना चाहिए। आपके मामले में यह कोई समस्या नहीं है, लेकिन आम तौर पर यह विचार करने के लिए कुछ है।

+0

+1 - मुझे अभी भी "भ्रमित सरणी ऑब्जेक्ट" के बारे में अनुच्छेद थोड़ा उलझन में मिलता है: वास्तविक सरणी को पार करने के लिए मुझे देखने का एकमात्र कारण यह है कि कॉलर कैली द्वारा किए गए परिवर्तन देख सकता है (उलटा, सॉर्टिंग) - लेकिन खोज की आवश्यकता नहीं होगी? –

+1

हां, वह खराब लिखा गया था और शायद बहुत महत्वपूर्ण नहीं था। मैंने इसे थोड़ा भ्रमित करने की कोशिश करने के लिए थोड़ा सा सुझाव दिया और यह भी दिखाया कि यह मामूली समस्या है, अगर यह वास्तव में एक मुद्दा है। धन्यवाद। संकलन दिखाने के लिए –

2

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

+0

मुझे लगता है कि वह एक खुले सरणी पैरामीटर के बारे में बात कर रहा है। पुरानी भाषाओं में तर्कों के अंत का निर्धारण करने का एकमात्र तरीका कैनरी, या प्रारूप स्ट्रिंग का उपयोग करना था। जावा में ऐसा नहीं है। सादगी के लिए, मैं varargs का उपयोग करता हूं क्योंकि आपको कोड को संभावित रूप से अधिक समझने योग्य अस्थायी सूची बनाने की आवश्यकता नहीं है – Petesh

+0

"यदि उपयोगकर्ता को रनटाइम पर तर्कों की संख्या निर्धारित करने में सक्षम होना चाहिए" तो वह केवल एक सरणी पास करेगा। सरणी पास करने के लिए –

1

मुझे लगता है कि अन्य विकल्प List<String> का उपयोग करना है। व्यक्तिगत रूप से मैं List का उपयोग करता हूं यदि कुछ तर्कों से अधिक हैं या यदि तर्क स्वचालित रूप से कहीं से संसाधित होते हैं (उदाहरण के लिए फ़ाइल से पार्स किए गए)।

यदि आप कोड में मैन्युअल रूप से तर्क लिख रहे होंगे, तो मैं आपके द्वारा प्रस्तावित वैरगास का उपयोग करना पसंद करूंगा।

3

चूंकि varargs तर्क एक सरणी तर्क में संकलित हो जाते हैं, इसलिए आप आमतौर पर varargs पसंद कर सकते हैं क्योंकि यह कुछ मामलों में अधिक समृद्ध हो सकता है और फिर भी अन्य मामलों में एक सरणी पारित करने की अनुमति देता है।

public void importFrom(String... paths) 
{ 
} 

public void importFrom(String[] paths) 
{ 
} 

में संकलित वैकल्पिक रूप से आप भी आसान संग्रह के रूप में तर्क पारित करने के लिए बनाने के लिए Iterable<String> इस्तेमाल कर सकते हैं।

+0

+1। –