Java Varargs (Μεταβλητά επιχειρήματα) με παραδείγματα

Σε αυτό το άρθρο, θα μάθετε για τα varargs στην Java με τη βοήθεια παραδειγμάτων. Θα μάθετε επίσης πότε να χρησιμοποιήσετε τα varargs και πότε να μην τα χρησιμοποιείτε.

Τι είναι το varargs στην Java;

Ας υποθέσουμε ότι δημιουργείτε μια μέθοδο Java. Ωστόσο, δεν είστε βέβαιοι πόσα επιχειρήματα θα αποδεχτεί η μέθοδος σας. Για την αντιμετώπιση αυτού του προβλήματος, το Java 1.5 εισήγαγε varargs.

Το Varargs είναι ένα σύντομο όνομα για μεταβλητά ορίσματα. Στην Java, ένα επιχείρημα μιας μεθόδου μπορεί να δεχτεί αυθαίρετο αριθμό τιμών. Αυτό το επιχείρημα που μπορεί να αποδεχτεί μεταβλητό αριθμό τιμών ονομάζεται varargs.

Η σύνταξη για την εφαρμογή varargs έχει ως εξής:

 accessModifier MethodName (τύπος δεδομένων… arg) (// body method)

Για τον ορισμό του vararg, (τρεις κουκκίδες) χρησιμοποιείται στην τυπική παράμετρο μιας μεθόδου.

Μια μέθοδος που λαμβάνει μεταβλητό αριθμό ορισμάτων ονομάζεται μέθοδος μεταβλητής αρτηρίας ή απλά μια μέθοδος varargs.

Αρχικά, ας δούμε το παράδειγμα χωρίς τη χρήση 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)); ) )

Όταν εκτελείτε αυτό το πρόγραμμα, η έξοδος θα είναι:

 3 6

Όπως μπορείτε να δείτε ξεκάθαρα, έπρεπε να υπερφορτώσετε τη sumNumber()μέθοδο για να λειτουργήσει για 3 ορίσματα.

Τι γίνεται αν ο χρήστης θέλει να προσθέσει 5 αριθμούς ή 10 ή 100;

Αυτό μπορεί να αντιμετωπιστεί με τακτοποιημένο τρόπο με τη χρήση varargs. Ας δούμε ένα παράδειγμα κώδικα:

Παράδειγμα: Εργασία των varargs

 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()μέθοδος θα χρησιμοποιηθεί μόνο για τον υπολογισμό του αθροίσματος των δύο ή 3 ορισμάτων, χρησιμοποιήστε υπερφόρτωση όπως στο πρώτο παράδειγμα.

Ας πάρουμε ένα άλλο παράδειγμα. Η μέθοδος format () που ορίζεται στη βιβλιοθήκη Java δέχεται varargs. Στο JDK, η format()μέθοδος ορίζεται ως εξής:

 δημόσια στατική μορφή συμβολοσειράς (Locale l, String format, Object… args) (// body)

Παράδειγμα: μορφή () Μέθοδος

 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, Emp Count: 6 Τύπος: ιστότοπος φροντιστηρίου 

Πώς λειτουργεί το varargs πίσω από τη σκηνή;

Ας εξετάσουμε τον ακόλουθο ψευδο κώδικα:

 public int sumNumber (int… nums) (// μέθοδος σώματος)

Η σύνταξη λέει στον μεταγλωττιστή Java ότι η μέθοδος μπορεί να κληθεί με μηδενικά ή περισσότερα ορίσματα. Ως αποτέλεσμα, η μεταβλητή αριθμών δηλώνεται σιωπηρά ως πίνακας τύπου int( ). Έτσι, μέσα στη μέθοδο, η μεταβλητή αριθμών έχει πρόσβαση χρησιμοποιώντας τη σύνταξη του πίνακα.

Σε περίπτωση που δεν υπάρχουν επιχειρήματα, το μήκος των αριθμών είναι 0.

Υπερφόρτωση μεθόδων Varargs

Παρόμοια με τις τυπικές μεθόδους, μπορείτε να υπερφορτώσετε τις μεθόδους vararg.

Συνιστώμενη ανάγνωση: Υπερφόρτωση μεθόδου Java

Παράδειγμα: Υπερφόρτωση μεθόδου Varargs

 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"); ) ) 

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 άθροισμα = 6 negate = false args.length = 2

Στο παραπάνω πρόγραμμα, η test()μέθοδος είναι υπερφορτωμένη αλλάζοντας τον αριθμό των επιχειρημάτων που αποδέχεται.

Πράγματα που πρέπει να θυμάστε κατά τη χρήση του Varargs

Εδώ είναι μερικά πράγματα που πρέπει να θυμάστε ενώ εργάζεστε με Java vargars:

1. Κατά τον καθορισμό της υπογραφής της μεθόδου, διατηρείτε πάντα τα varargs επιτέλους.

Το μεταβλητό όρισμα πρέπει να είναι το τελευταίο όρισμα που μεταβιβάστηκε στη μέθοδο. Ας δούμε, κάνατε χρήση doSomething()μεθόδου ως εξής:

 doSomething (1, 2, 3, 4);

Και, η doSomething()μέθοδος σας ορίζεται ως:

 // λανθασμένη δήλωση μεθόδου public void doSomething (int… nums, int p) (// body method)

Σε αυτήν την περίπτωση, ο μεταγλωττιστής δεν μπορεί να υπολογίσει τον αριθμό των ορισμάτων που μεταβιβάστηκαν στους αριθμούς.

Ωστόσο, εάν ορίσετε τη μέθοδο σας ως:

 public void doSomething (int p, int… nums) (// μέθοδος σώματος)

Ο μεταγλωττιστής Java εκχωρεί το πρώτο όρισμα στο p και τα υπόλοιπα intορίσματα αντιστοιχίζονται σε αριθμούς.

2. Μια μέθοδος μπορεί να έχει μόνο μία παράμετρο varargs.

Για παράδειγμα, αυτή η δήλωση μεθόδου είναι λανθασμένη:

 int doSomething (int p, float… floatNums, double… doubleNums) (// κωδικός)

Υπερφόρτωση μεθόδου αμφιβολίας στη μέθοδο Varargs

Ας θεωρήσουμε ότι έχετε υπερφορτωμένη test()μέθοδο όπως αυτή:

 επίδειξη τάξης (δοκιμή στατικού κενού (int… vargs) (// body method) δοκιμή στατικού κενού (int n, int… vargs) (// body method))

Στο παραπάνω πρόγραμμα, ο μεταγλωττιστής μπερδεύεται εάν προσπαθήσετε να επικαλεστείτε τη test()μέθοδο, παρόλο που οι test()μέθοδοι είναι υπερφορτωμένες και δέχεται διαφορετικό αριθμό ορισμάτων.

Ο μεταγλωττιστής δεν γνωρίζει ποια μέθοδο να καλέσει. Ο μεταγλωττιστής μπορεί να σκεφτεί, προσπαθείτε να καλέσετε test(int… vargs)με ένα όρισμα varargs. Επίσης, ο μεταγλωττιστής μπορεί να σκεφτεί, προσπαθείτε να καλέσετε test(int n, int… vargs)με το όρισμα να περάσει στην πρώτη παράμετρο με κενή δεύτερη παράμετρο.

Δεδομένου ότι υπάρχουν δύο δυνατότητες, προκαλεί αμφισημία. Εξαιτίας αυτού, μερικές φορές ίσως χρειαστεί να χρησιμοποιήσετε δύο διαφορετικά ονόματα μεθόδων αντί για υπερφόρτωση της μεθόδου varargs.

ενδιαφέροντα άρθρα...