इस पद्धति के हस्ताक्षर के लिए दीर्घवृत्त (…) क्या है?


203

में App इंजन डॉक्स , दीर्घवृत्त (क्या है JID...) इस विधि हस्ताक्षर में के लिए?

public MessageBuilder withRecipientJids(JID... recipientJids)

उन तीन डॉट्स का क्या कार्य है?


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

जवाबों:


208

वे Java वैरग हैं। वे आपको किसी विशिष्ट प्रकार की किसी भी संख्या को पास करने देते हैं (इस मामले में वे टाइप JID के हैं)।

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

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/larargs.html


16
ध्यान दें कि तर्कों को JID की एक सरणी के रूप में भी पारित किया जा सकता है (यह varargs को पीछे से संगत बनाता है)।
मजनू

54
यह भी ध्यान दें कि 0 varargs (कुछ नहीं) पास करना कानूनी है।
हॉकी पार्कर

9
अंतिम लेकिन कम से कम नहीं, वैरग विधि का अंतिम पैरामीटर होना चाहिए। इसलिए, आपके पास एक ही विधि में दो वैरग पैरामीटर नहीं हो सकते हैं। हो सकता है, आप इस विधि को दिलचस्प पा सकते हैं। डॉक्स। Comacle.com/javase/7/docs/api/java/util/…
BlackBrain

62

विधि के अंदर दीर्घवृत्त या varargs का उपयोग करने का तरीका ऐसा है जैसे यह एक सरणी हो:

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

इस विधि को निम्नलिखित कहा जा सकता है:

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

अंदर PrintWithEllipsis, setOfStringsस्ट्रिंग का एक प्रकार है। तो आप संकलक को कुछ काम बचा सकते हैं और एक सरणी दे सकते हैं:

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

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

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

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

स्रोत: जावा प्रोग्रामिंग लैंग्वेज स्पेसिफिकेशन, जहां तकनीकी शब्द variable arity parameterसामान्य शब्द के बजाय है varargs


22

तीन बिंदु (...) संकेतन वास्तव में गणित से उधार लिया गया है, और इसका अर्थ है "... और इसी तरह"।

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


5

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

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

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

varargsजावा 1.5 पर जोड़ा गया था


3

इसका अर्थ है कि विधि प्रकार के तर्कों ("varargs") की एक चर संख्या को स्वीकार करती है JID। विधि के भीतर, recipientJidsप्रस्तुत किया गया है।

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

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

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