स्ट्रिंग [] आर्ग्स बनाम (स्ट्रिंग।। आर्ग्स)


9

एंड्रॉइड के लिए प्रोग्रामिंग करते समय, जब भी मैं एक AsyncTask का उपयोग करता हूं doInBackground विधि इस तरह दिखती है।

 protected String doInBackground(String... args)

लेकिन उस ब्लॉक में कहीं भी तर्कों का उपयोग करते समय मैं उन्हें अपने कार्यक्रम में उदाहरण के लिए एक सामान्य स्ट्रिंग सरणी की तरह एक्सेस कर सकता हूं

        @Override
    protected String doInBackground(String... args)
    {
        String details = "";
        try
        {
            details = facade.getRecipeDetails(args[0]);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return details;
    }

जो ठीक काम करता है और मुझे इससे निपटने में कोई समस्या नहीं है। लेकिन मैं सोच रहा हूं कि स्ट्रिंग्स के सामान्य सरणी के बजाय वे (स्ट्रिंग।। args) का उपयोग क्यों करते हैं। क्या यह सिर्फ इसलिए है क्योंकि कॉलिंग पद्धति में आप कुछ ऐसा लिख ​​सकते हैं:

 new AsyncHandler.execute("argument1","argument2","argument3",...)  

तर्कों को पारित करने के लिए एक नया सरणी बनाने के बजाय? हालांकि हम लिख सकते थे

new AsyncHandler().execute(new String[]{"Argument1","Argument2"});

जो एक और अधिक वर्बोज़ सा है।

क्या (स्ट्रिंग ...) और स्ट्रिंग [] पर्यायवाची हैं कि वे कैसे काम करते हैं, लेकिन तर्क पास करना पूर्व का उपयोग करना आसान है क्योंकि कोई सरणी बनाने की आवश्यकता नहीं है? जहाँ तक मैं बता सकता हूँ, पूर्व भी पृष्ठभूमि में एक स्ट्रिंग सरणी में अनुवाद किया जाता है, तो क्या वे दोनों एक ही कोड के लिए संकलित करेंगे और यह सिर्फ 'वाक्यगत चीनी' है?


(String ...)मतलब आप जितना Stringचाहें उतना परम जोड़ सकते हैं, String[]एक पैरामीटर है जो स्ट्रिंग्स की एक सरणी है। (String ...)के पहले परम पर निर्भर करता है AsyncTask, यह हमेशा नहीं होता है String
FaizanRabbani

@ फैज़ान रब्बानी को छोड़कर आप भी String...इसे कॉल कर सकते हैं जैसे कि यह हैString[]
शाफ़्ट फ्रीक

@ratchetfreak हाँ यह एक के रूप में कार्य कर सकता है String[], लेकिन यह डिफ़ॉल्ट रूप से मान लेता है String[]। यह Stringएक सरणी में विभिन्न परम का उपयोग करने के लिए काफी समस्या होती । इसके बजाय उन्होंने उपयोग करने के लिए एक लचीलापन दिया (String ...)
फैजानरनबनी

@FaizanRabbani मुझे पता है कि यह हमेशा स्ट्रिंग नहीं है, यह सिर्फ एक उदाहरण है =)। सेम बुलियन ... या अन्य चीजों के लिए जाता है, लेकिन मुझे मुख्य (स्ट्रिंग [] आर्ग्स) से परिचित होने के कारण स्ट्रिंग का उपयोग करना पसंद है। और आपने कहा था 'आप जितना चाहें उतने तार पार कर सकते हैं', वैसे आप एक सरणी के साथ काफी तार भी पास कर सकते हैं। मेरे लिए यह अभी भी लगता है कि आप सरणियों के साथ इसे प्राप्त कर सकते हैं, हालांकि यह कम पठनीय है और परेशानी का अधिक है। (उदाहरण के लिए सरणियों का एक सरणी पास करना, पठनीयता को थोड़ा कम कर देगा)। क्या यह सही है कि यह मुख्य रूप से पठनीयता के लिए है? (धन्यवाद पहले ही btw)
डायलन मीस

@FaizanRabbani अच्छी तरह से इसे new String[]{...}बदलने के लिए एक सरल आवरण है (यह वास्तव में तब होता है जब आप उपयोग करते हैं String...)
शाफ़्ट सनकी

जवाबों:


15

(String ...)है मानकों की एक सरणी प्रकार का Stringहै, जहां के रूप में String[]है एक एकल पैरामीटर

अब यहां String[]एक ही उद्देश्य को पूरा किया जा सकता है, लेकिन (String ...)उपयोग करने के लिए अधिक पठनीयता और सहजता प्रदान करता है।

यह एक विकल्प भी प्रदान करता है कि हम Stringएक का उपयोग करके एक के बजाय कई सरणी पास कर सकते हैं String[]


1
जबकि String[]एक विधि लेने में पारित किया जा सकता String...एक पैरामीटर के रूप, दो String[]रों नहीं कर सकता। कोई अंतर्निहित सरणी संयोजन है कि यहाँ समा जाती है।

5

स्ट्रिंग [] बनाम स्ट्रिंग ... की एक विशेषता यह है कि "स्ट्रिंग ..." कॉल का हिस्सा बनने की आवश्यकता नहीं है।

public void test(String... args){ 
   if(args.length > 0){
      for( String text : args){
         System.out.println(text);
      }
   }else{
      System.out.println("No args defined.");
   }
}

public void callerTest(){
     test();
     System.out.println();

     test("tree");
     System.out.println();

     test("dog", "cat", "pigeon");
}

यदि आप कहते हैं callerTest();तो आउटपुट होगा:

No args defined.

tree

dog
cat
pigeon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.