उदाहरणों के साथ जावा वरार्ग्स (परिवर्तनीय तर्क)

इस लेख में, आप उदाहरणों की मदद से जावा में varargs के बारे में जानेंगे। आप यह भी सीखेंगे कि वेरिग्स का उपयोग कब करना है और कब उनका उपयोग नहीं करना है।

Java में varargs क्या है?

मान लीजिए कि आप एक जावा विधि बना रहे हैं। हालाँकि, आप सुनिश्चित नहीं हैं कि आपका तरीका कितने तर्क को स्वीकार करने वाला है। इस समस्या को हल करने के लिए, जावा 1.5 ने वैरग पेश किया।

Varargs वैरिएबल तर्कों का एक छोटा नाम है। जावा में, विधि का एक तर्क मनमाने ढंग से संख्या को स्वीकार कर सकता है। यह तर्क जो मानों की चर संख्या को स्वीकार कर सकता है, वैरगेज कहलाता है।

वैरिकाज़ को लागू करने का सिंटैक्स इस प्रकार है:

 accessModifier MethodName (डेटाटाइप … arg) (// मेथड बॉडी)

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

एक विधि जो चर संख्याओं को तर्क के रूप में लेती है, उसे चर-विधि विधि कहा जाता है, या केवल एक वर्ण विधि।

सबसे पहले, बिना varargs का उपयोग किए उदाहरण देखें:

 class NoVararg ( public int sumNumber(int a, int b)( return a+b; ) public int sumNumber(int a, int b, int c)( return a+b+c; ) public static void main( String() args ) ( NoVararg obj = new NoVararg(); System.out.println(obj.sumNumber(1, 2)); System.out.println(obj.sumNumber(1, 2, 3)); ) )

जब आप यह प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 ३ ६

जैसा कि आप स्पष्ट रूप से देख सकते हैं, आपको sumNumber()इसे 3 तर्कों के लिए काम करने के लिए अधिभार विधि करना पड़ा ।

क्या होगा यदि उपयोगकर्ता 5 नंबर या 10 या 100 जोड़ना चाहता है?

इसे साफ-सुथरे तरीके से वर्गास के उपयोग के साथ संभाला जा सकता है। आइए एक कोड उदाहरण देखें:

उदाहरण: वर्गाकार कार्य करना

 class VarargExample ( public int sumNumber(int… args)( System.out.println("argument length: " + args.length); int sum = 0; for(int x: args)( sum += x; ) return sum; ) public static void main( String() args ) ( VarargExample ex = new VarargExample(); int sum2 = ex.sumNumber(2, 4); System.out.println("sum2 = " + sum2); int sum3 = ex.sumNumber(1, 3, 5); System.out.println("sum3 = " + sum3); int sum4 = ex.sumNumber(1, 3, 5, 7); System.out.println("sum4 = " + sum4); ) )

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 तर्क लंबाई: 2 योग 2 = 6 तर्क लंबाई: 3 योग 3 = 9 तर्क लंबाई: 4 योग 4 = 16

यहाँ, sumNumber()विधि उस पर दिए गए intमापदंडों का योग लौटाती है (पारित किए गए तर्कों की संख्या से कोई फर्क नहीं पड़ता)।

जैसा कि आप देख सकते हैं, कुछ स्थितियों में varargs वास्तव में उपयोगी हो सकते हैं। हालाँकि, यदि आप किसी विधि के लिए दिए गए तर्कों की संख्या के बारे में निश्चित हैं, तो इसके बजाय ओवरलोडिंग विधि का उपयोग करते हैं। उदाहरण के लिए, यदि आप निश्चित हैं कि sumNumber()विधि का उपयोग केवल 2 या 3 तर्कों के योग की गणना करने के लिए किया जाएगा, तो पहले उदाहरण में ओवरलोडिंग का उपयोग करें।

एक और उदाहरण लेते हैं। जावा लाइब्रेरी में परिभाषित प्रारूप () विधि varargs स्वीकार करती है। JDK में, format()विधि निम्नानुसार परिभाषित की गई है:

 सार्वजनिक स्थैतिक स्ट्रिंग प्रारूप (लोकेल एल, स्ट्रिंग प्रारूप, ऑब्जेक्ट… आर्ग्स) (// बॉडी)

उदाहरण: प्रारूप () विधि

 class Company ( public static void main(String() args) ( String siteName = "programiz.com"; int empCount = 6; String type = "tutorial website"; System.out.println( String.format( "Site Name : %s, Emp Count: %d Type: %s", siteName, empCount, type ) ); ) )

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 साइट का नाम: programiz.com, एम्प गणना: 6 प्रकार: ट्यूटोरियल वेबसाइट 

कैसे दृश्य के पीछे varargs काम करता है?

चलो निम्नलिखित छद्म कोड पर विचार करें:

 सार्वजनिक int समनंबर (int… अंक) (// मेथड बॉडी)

वाक्य रचना जावा कम्पाइलर कि विधि शून्य या अधिक तर्क के साथ कहा जा सकता है बताता है। परिणामस्वरूप, अंक चर को स्पष्ट रूप से एक प्रकार की सरणी के रूप में घोषित किया जाता है int( )। इस प्रकार, विधि के अंदर, सरणी सिंटैक्स का उपयोग करके अंक चर तक पहुँचा जाता है।

बिना किसी तर्क के, अंकों की लंबाई 0 है।

वर्जर तरीकों को ओवरलोड करना

विशिष्ट विधियों के समान, आप वैरग विधियों को अधिभारित कर सकते हैं।

अनुशंसित पढ़ना: जावा विधि ओवरलोडिंग

उदाहरण: वरार्ग्स विधि ओवरलोडिंग

 class VarargOverload ( private void test(int… args)( int sum = 0; for (int i: args) ( sum += i; ) System.out.println("sum = " + sum); ) private void test(boolean p, String… args)( boolean negate = !p; System.out.println("negate = " + negate); System.out.println("args.length = "+ args.length); ) public static void main( String() args ) ( VarargOverload obj = new VarargOverload(); obj.test(1, 2, 3); obj.test(true, "hello", "world"); ) ) 

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 sum = 6 negate = false args.length = 2

उपरोक्त कार्यक्रम में, test()यह स्वीकार किए जाने वाले तर्कों की संख्या को बदलकर विधि को अधिभारित किया जाता है।

वरग का उपयोग करते समय याद रखने योग्य बातें

यहां उन कुछ चीजों के बारे में बताया गया है जिन्हें आपको जावा वेरगर्स के साथ काम करते समय याद रखना चाहिए:

1. विधि हस्ताक्षर को परिभाषित करते समय, हमेशा अंतिम पर varargs रखें।

चर तर्क विधि के लिए पारित अंतिम तर्क होना चाहिए। आइए विचार करें, आपने doSomething()इस तरह विधि लागू की है :

 doSomething (1, 2, 3, 4);

और, आपकी doSomething()विधि इस प्रकार परिभाषित की गई है:

 // गलत विधि घोषणा सार्वजनिक शून्य doSething (इंट… अंक, इंट पी) (// विधि बॉडी)

इस मामले में, संकलक संख्याओं के लिए पारित तर्कों की संख्या का पता नहीं लगा सकता है।

हालाँकि, यदि आप अपनी विधि इस प्रकार परिभाषित करते हैं:

 सार्वजनिक शून्य DoSomething (इंट पी, इंट… अंक) (// विधि बॉडी)

The Java compiler assigns the first argument to p, and the remaining int arguments are assigned to nums.

2. A method can have only one varargs parameter.

For example, this method declaration is incorrect:

 int doSomething(int p, float… floatNums, double… doubleNums) ( // code )

Ambiguity in Varargs Method overloading

Let’s consider you overloaded test() method like this:

 class Demo ( static void test(int… vargs) ( // method body ) static void test(int n, int… vargs) ( // method body ) )

In the above program, the compiler gets confused if you try to invoke the test() method even though test() methods are overloaded and accepts different number of arguments.

संकलक को पता नहीं है कि किस पद्धति से कॉल करना है। संकलक सोच सकता है, आप test(int… vargs)एक varargs तर्क के साथ कॉल करने का प्रयास कर रहे हैं । इसके अलावा, कंपाइलर सोच सकता है, आप test(int n, int… vargs)खाली दूसरे पैरामीटर के साथ पहले पैरामीटर को पास किए गए तर्क के साथ कॉल करने का प्रयास कर रहे हैं ।

चूंकि दो संभावनाएं हैं, यह अस्पष्टता का कारण बनता है। इस वजह से, कभी-कभी आपको ओवररिंग वेरगेज विधि के बजाय दो अलग-अलग विधि नामों का उपयोग करने की आवश्यकता हो सकती है।

दिलचस्प लेख...