2010-03-02 12 views
169

App Engine docs में, इस विधि हस्ताक्षर में इलिप्सिस (JID...) क्या है?इस विधि हस्ताक्षर में इलिप्सिस (...) क्या है?

public MessageBuilder withRecipientJids(JID... recipientJids) 

उन तीन बिंदुओं का कार्य क्या है?

+5

वैसे, मैंने हॉरिज़ोनल ELLIPSIS चरित्र, '...', यूनिकोड यू +2026 की कोशिश की। जावा 8 में नेटबीन 8 "अवैध चरित्र" की रिपोर्ट करता है। तो जावा varargs ट्रिपल पूर्ण रोक (अवधि), '...' की आवश्यकता है। –

उत्तर

178

वे जावा varargs हैं। वे आपको किसी विशिष्ट प्रकार की ऑब्जेक्ट्स को पास करने देते हैं (इस मामले में वे जेआईडी प्रकार के होते हैं)।

अपने उदाहरण में, निम्न फ़ंक्शन कॉल मान्य होगा:

MessageBuilder msgBuilder; //There should probably be a call to a constructor here ;) 
MessageBuilder msgBuilder2; 
msgBuilder.withRecipientJids(jid1, jid2); 
msgBuilder2.withRecipientJids(jid1, jid2, jid78_a, someOtherJid); 

यहाँ अधिक देखें: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

+13

ध्यान दें कि तर्क भी जेआईडी की सरणी के रूप में पारित किया जा सकता है (इससे varargs पिछड़े संगत बनाता है)। – mjn

+43

यह भी ध्यान दें कि 0 varargs (कुछ नहीं) गुजरना कानूनी है। –

+6

अंतिम लेकिन कम से कम नहीं, vararg विधि का अंतिम पैरामीटर होना चाहिए। तो, आपके पास एक ही विधि में दो vararg पैरामीटर नहीं हो सकते हैं। हो सकता है, आप इस विधि को दिलचस्प बना सकते हैं http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList%28T...%29 – BlackBrain

3

इसका मतलब है कि विधि एक variable number of arguments प्रकार JID की ("varargs") स्वीकार करता है। विधि के भीतर, recipientJids प्रस्तुत किया गया है।

यह उन मामलों के लिए आसान है जहां आपके पास ऐसी विधि है जो वैकल्पिक तरीके से एक से अधिक तर्कों को वैकल्पिक तरीके से संभाल सकती है, और आपको कॉल लिखने की अनुमति देती है जो बिना किसी विधि के एक, दो या तीन पैरामीटर पास कर सकती है फ्लाई पर एक सरणी बनाने की कुरूपता।

यह सी से sprintf जैसे मुहावरे को भी सक्षम बनाता है; उदाहरण के लिए String.format() देखें।

5

वे varargs हैं जिनका उपयोग वे किसी भी प्रकार की तर्क प्राप्त करने के लिए किया जाता है।

उदाहरण के लिए PrintStream.printf विधि इसका उपयोग करती है, क्योंकि आप नहीं जानते कि आप कितने तर्क का उपयोग करेंगे।

इन्हें केवल तर्कों की अंतिम स्थिति के रूप में उपयोग किया जा सकता है।

varargsJava 1.5

18

तीन डॉट (...) अंकन वास्तव में गणित से लिया गया है पर जोड़ दिया गया था, और यह अर्थ है "... और इतने पर"।

जावा में इसके उपयोग के लिए, यह varargs है, जिसका अर्थ है कि विधि कॉल में किसी भी संख्या में तर्क जोड़े जा सकते हैं। केवल सीमाएं हैं कि varargs विधि हस्ताक्षर के अंत में होना चाहिए और केवल एक विधि हो सकती है।

51

रास्ता अंडाकार या varargs विधि के अंदर उपयोग करने के लिए है के रूप में अगर यह एक सरणी थे:

obj.PrintWithEllipsis(); // prints nothing 
obj.PrintWithEllipsis("first"); // prints "first" 
obj.PrintWithEllipsis("first", "second"); // prints "first\nsecond" 

के अंदर:

public void PrintWithEllipsis(String...setOfStrings) { 
    for (String s : setOfStrings) 
     System.out.println(s); 
} 

इस विधि निम्नलिखित के रूप में कहा जा सकता है PrintWithEllipsis, setOfStrings का प्रकार स्ट्रिंग की एक सरणी है। तो तुम संकलक कुछ काम बचा सकता है और एक सरणी गुजारें सकता:

String[] argsVar = {"first", "second"}; 
obj.PrintWithEllipsis(argsVar); 

लिए तरीकों varargs, एक दृश्य पैरामीटर एक ही प्रकार की एक सरणी होने के रूप में व्यवहार किया जाता है।तो अगर दो हस्ताक्षरों केवल में है कि एक एक दृश्य और अन्य एक सरणी वाणी, इस उदाहरण में लेकर मतभेद हैं:

void process(String[] s){} 
void process(String...s){} 

तो एक संकलन समय त्रुटि उत्पन्न होती है।

स्रोत: The Java Programming Language विनिर्देश, जहां तकनीकी शब्द variable arity parameter सामान्य शब्द varargs की बजाय है।

+8

+1 सरणी बनाम इलिप्सिस के लिए +1 विधि हस्ताक्षर बिट। – aspen100

2

आप एक पैरामीटर को परिभाषित कर सकते हैं जो आपके तरीकों में परिवर्तनीय तर्क (varargs) स्वीकार कर सकता है। के बाद कि चर तर्क स्वीकार करता वर्ग कर्मचारी है, जो एक विधि daysOffWork को परिभाषित करता है का एक उदाहरण है:

class Employee { 
    public int daysOffWork(int... days) { 
     int daysOff = 0; 
     for (int i = 0; i < days.length; i++) { 
      daysOff += days[i]; 
     } 
     return daysOff; 
    } 
} 

दीर्घवृत्त (...) है कि डेटा प्रकार इस प्रकार है इंगित करता है कि विधि पैरामीटर दिनों एक पारित किया जा सकता सरणी या एकाधिक अल्पविराम से अलग मूल्य।

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