2010-10-18 14 views
16

मुझे वाक्यविन्यास समझ में नहीं आता है। विभिन्न शब्दों के साथ-साथ "..." को Google पर कोशिश करना बेकार है।पैरामीटर सूची में "..." का क्या अर्थ है? doInBackground (स्ट्रिंग ... पैराम्स)

+1

[जावा, पैरामीटर में 3 बिंदुओं] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3158730/java-3-dots-in-parameters) – Raedwald

उत्तर

10

यह (कई languges में उदाहरण के साथ विकि पृष्ठ) Variadic function कहा जाता है।

कंप्यूटर प्रोग्रामिंग में, एक variadic समारोह अनिश्चितकालीन arity के एक समारोह है, यानी एक जो तर्कों की चर संख्या को स्वीकार करता है। विविधता कार्यों के लिए समर्थन प्रोग्रामिंग भाषाओं के बीच व्यापक रूप से भिन्न है। कई गणितीय और तार्किक संचालन जो स्वाभाविक रूप से पर भिन्न कार्य के रूप में आते हैं। उदाहरण के लिए, संख्याओं का योग या स्ट्रिंग्स या अन्य अनुक्रमों का संयोजन ऑपरेशन है जो तर्कसंगत रूप से ऑपरेटरों पर लागू हो सकता है। एक और ऑपरेशन जिसमें को कई भाषाओं में एक भिन्न फ़ंक्शन के रूप में कार्यान्वित किया गया है, आउटपुट स्वरूपण है। सी फ़ंक्शन printf और सामान्य लिस्प फ़ंक्शन प्रारूप ऐसे दो उदाहरण हैं। दोनों एक तर्क लेते हैं जो आउटपुट के स्वरूपण निर्दिष्ट करता है, और तर्कों की संख्या जो को मान प्रदान करता है स्वरूपित किया गया है। वैराडिक फ़ंक्शन कुछ भाषाओं में टाइप-सुरक्षा समस्याओं का पर्दाफाश कर सकते हैं। उदाहरण के लिए, सी के printf, यदि सावधानीपूर्वक उपयोग किया जाता है, तो को प्रारूप स्ट्रिंग हमलों के नाम से जाना जाने वाले सुरक्षा छेदों की एक श्रेणी को जन्म दे सकता है।हमला संभव है क्योंकि भिन्नता कार्यों के लिए भाषा समर्थन टाइप-सुरक्षित नहीं है; यह फ़ंक्शन को पर स्टैक से अधिक तर्कों को पॉप करने का प्रयास करता है - स्टैक को दूषित करता है और अप्रत्याशित व्यवहार की ओर जाता है। Variadic कार्यक्षमता लागू समारोह, जो एक समारोह और तर्क के रूप में एक सूची/अनुक्रम/सरणी लेता है और तो फ़ंक्शन को कॉल एक बार, तर्क सूची के तत्वों होने के साथ करने के लिए पूरक माना जा सकता है।

मई व्यक्तिगत पसंदीदा में नहीं इस्तेमाल किया सुविधाओं जावा में से एक। यह मूल रूप से एक संदर्भ सरणी है जो तत्वों से बनाई गई है। इसका उपयोग करने के सर्वोत्तम तरीकों में से एक वर्ग कन्स्ट्रक्टर, या विधि पर है जहां आपको लगातार 2, 3, 4, 5 इनपुट तत्वों जैसे मूल्य को खोजने की आवश्यकता होती है।

एक उदाहरण यह है कि, जब मैंने कोडिंग कार्यों के लिए एक सामान्य binary tree node बनाया, तो मैंने इसे कन्स्ट्रक्टर में उपयोग किया। इससे मुझे बस पेड़ में तत्व जोड़ते हैं और उन्हें वितरित किया जाता है।

रूट "Red" और 2 शाखा "Blue" और "Green" रूट के साथ स्ट्रिंग प्रकार बाइनरी पेड़ बनाता है।

new MBTN<String>("Red", "Blue", "Green"). 

आपको लगता है सका विकल्प होगा क्या: डी तुम भी बस तत्वों के सामान्य सरणी नहीं कर सकते हैं, तो यह नरक की तरह फैल जाएगा। यह निश्चित रूप से बेकार नहीं है।

+0

धन्यवाद सब कुछ। मैं पूरी तरह समझ गया। मुझे लगता है कि यह नहीं पता था कि मैंने बस अपनी जगह में एक स्ट्रिंग [] का उपयोग किया होगा। लेकिन अब मैं दूसरों को लिखने वाले कोड को पढ़ सकता हूं। – Jim

+0

"आप तत्वों की जेनेरिक सरणी भी नहीं बना सकते हैं" तो इस तरह से varargs का उपयोग करते समय आपको चेतावनी मिलेगी, क्योंकि यह दृश्यों के पीछे एक सामान्य सरणी बनाने का भी प्रयास करेगी, लेकिन – newacct

+0

मुझे उल्लेख नहीं करना चाहिए, कि ** नया एमबीटीएन (Arrays.asList ("लाल", "नीला", "हरा")); ** बेहतर माना जाएगा। – Margus

14

इसे varargs कहा जाता है। इस तथ्य को better Google results पैदा करना चाहिए।

+0

यदि आप नहीं जानते कि खोजना आसान नहीं है इसे कहा जाता है ... –

+5

@ करलोस: उहम, यही कारण है कि मैंने जवाब दिया कि इसे कैसे कहा जाता है। – BalusC

0

यह एक जावा विधि है जो मानदंडों

1

की एक मनमाना चर संख्या ले लिया वे चर लंबाई मानकों हैं।

यहाँ एक example.

3

@BalusC उल्लेख किया है के साथ एक लिंक है, यह एक varags पैरामीटर है। इसका मतलब है कि आप उस विधि में तर्कों की एक चर संख्या को पारित कर सकते हैं।

एक विधि के रूप

public void foo(String...strings) { } 

परिभाषित के लिए

तो निम्नलिखित आमंत्रण कानूनी हैं:

foo(); 
foo("one param"); 
foo("one", "two", "three"); 
0

इसका मतलब है "तर्कों की मनमानी संख्या" जिसका अर्थ है आप विधि में मानकों का एक अज्ञात संख्या पारित कर सकते हैं ..

http://download.oracle.com/javase/tutorial/java/javaOO/arguments.html देखना "तर्कों की मनमानी संख्या" के लिए देखो अनुभाग

public Polygon polygonFrom(Point... corners) { 
    int numberOfSides = corners.length; 
    double squareOfSide1, lengthOfSide1; 
    squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x) 
      + (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y) ; 
    lengthOfSide1 = Math.sqrt(squareOfSide1); 
    // more method body code follows that creates 
    // and returns a polygon connecting the Points 
} 
1

हर किसी के द्वारा उल्लेख किया है ... चर तर्क (या varargs) यदि आप ऐसा करने की अनुमति देता है ....

//Method we're using for varargs 
public void doSomething(String... datas) { 
    if (datas == null || datas.length == 0) { 
     System.out.println("We got nothing"); 
    } else { 
     for (String data: datas) { 
      System.out.println(data); 
     } 
    } 
} 

इसलिए, इन सभी कॉल्स नीचे उल्लेख मान्य हैं ....

String d[] = {"1", "2", "3"}; 
doSomething(d); //An array of String, as long as the type is exactly as the varargs type. 

//OR 
doSomething("1", "2", "3", "4"); //I can add "infinitely" many arguments as the JVM can allocate me.... 

//OR 
doSomething("1"); //Exactly 1; 

आंतरिक रूप से varargs "अनिवार्य रूप से" इसके घोषित प्रकार का एक संदर्भ सरणी है।

6

वे "परिवर्तनीय तर्क" या varargs (संक्षिप्त के लिए) हैं।

मूल रूप से यह तार के एक अज्ञात संख्या के निधन, तो विधि हस्ताक्षर

public void printStuff(String...messages) 

प्रभावी ढंग से संभाल कर सकते हैं निम्नलिखित कॉल

printStuff("hi"); 
printStuff("hi", "bye"); 
printStuff("Hello", "How are you?", "I'm doing fine.", "See you later"); 

आप प्रभावी रूप से इस autoboxing का एक प्रकार विचार कर सकते हैं अनुमति देता है। printStuff तर्क को सरणी के रूप में देखा जा सकता है, इसलिए printStuff(String...messages) अवधारणात्मक रूप से printStuff(String[] messages) की तरह संभाला जाता है। Wtih कॉल को प्रभावी ढंग से ऊपर

printStuff(new String[] {"hi"}); 
printStuff(new String[] {"hi", "bye"}); 
printStuff(new String[] {"Hello", "How are you?", "I'm doing fine.", "See you later"}); 

की तरह कार्य कर आंतरिक रूप से संदेशों का उपयोग करने के लिए आपको ठेठ List हैंडलिंग पुरातन का उपयोग करें।जैसे

... 
if (messages != null) { 
    for (String message : messages) { 
    System.out.println(message); 
    } 
} 
... 

कुछ वास्तव में सरणियों बनाने के लिए कोई जरूरत नहीं है यही कारण है कि वाक्यात्मक चीनी का एक सा ऑटो मुक्केबाजी के आगमन के साथ जावा को जोड़ा गया है।

+0

हाय मैं केवल एक पैरामीटर पास कर रहा हूं, उस तक कैसे पहुंचे। –

+0

@ श्रीधर केवल एक पैरामीटर को पार करते समय, यह सरणी में पहला (और केवल) तत्व बन जाता है। –

+0

उत्तर के लिए धन्यवाद मुझे यह मिला। हम संदेश के रूप में पहला तर्क प्राप्त कर सकते हैं [0]। –

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