Java Varargs (varijabilni argumenti) s primjerima

U ovom ćete članku uz primjere naučiti o varargovima u Javi. Također ćete naučiti kada koristiti vararge, a kada ih ne koristiti.

Što je varargs u Javi?

Pretpostavimo da kreirate Java metodu. Međutim, niste sigurni koliko argumenata će vaša metoda prihvatiti. Kako bi riješio ovaj problem, Java 1.5 predstavio je varargs.

Varargs je kratko ime za varijabilne argumente. U Javi argument metode može prihvatiti proizvoljan broj vrijednosti. Ovaj argument koji može prihvatiti varijabilni broj vrijednosti naziva se varargs.

Sintaksa za implementaciju varargova je sljedeća:

 accessModifier methodName (tip podataka… arg) (// tijelo metode)

Da bi se definirao vararg, u formalnom parametru metode koristi se (tri točke).

Metoda koja uzima varijabilni broj argumenata naziva se metodom varijabilne arity ili jednostavno varargs metodom.

Prvo, pogledajmo primjer bez upotrebe varargova:

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

Kada pokrenete ovaj program, izlaz će biti:

 3 6

Kao što jasno možete vidjeti, morali ste preopteretiti sumNumber()metodu kako bi uspjela za 3 argumenta.

Što ako korisnik želi dodati 5 brojeva ili 10 ili 100?

To se može riješiti na uredan način uz upotrebu vararga. Pogledajmo primjer koda:

Primjer: Rad vararga

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

Kada pokrenete program, izlaz će biti:

 duljina argumenta: 2 sum2 = 6 duljina argumenta: 3 sum3 = 9 duljina argumenta: 4 suma4 = 16

Ovdje sumNumber()metoda vraća zbroj intparametara koji su joj proslijeđeni (nije važno broj proslijeđenih argumenata).

Kao što vidite, varargi mogu biti zaista korisni u nekim situacijama. Međutim, ako ste sigurni u broj argumenata proslijeđenih metodi, umjesto toga upotrijebite preopterećenje metode. Na primjer, ako ste sigurni da sumNumber()će se ta metoda koristiti samo za izračunavanje zbroja 2 ili 3 argumenta, upotrijebite preopterećenje kao u prvom primjeru.

Uzmimo još jedan primjer. Metoda format () definirana u Java knjižnici prihvaća varargove. U JDK format()metoda je definirana kako slijedi:

 javni statični format niza (lokalitet l, format niza, objekt … args) (// tijelo)

Primjer: metoda 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 ) ); ) )

Kada pokrenete program, izlaz će biti:

 Naziv web mjesta: programiz.com, Broj pojavljivanja: 6 Tip: web stranica s vodičima 

Kako varargs djeluje iza scene?

Razmotrimo sljedeći pseudo kod:

 javni int sumNumber (int… nums) (// tijelo metode)

Sintaksa govori Java prevodilac koji način se može nazvati s nula ili više argumenata. Kao rezultat, varijabla nums implicitno je deklarirana kao niz tipa int( ). Dakle, unutar metode, nums varijabli se pristupa pomoću sintakse niza.

U slučaju da nema argumenata, duljina brojeva je 0.

Preopterećenje Varargovih metoda

Slično tipičnim metodama, i vi možete preopteretiti vararg metode.

Preporučeno čitanje: Preopterećenje Java metode

Primjer: Preopterećenje metode 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"); ) ) 

Kada pokrenete program, izlaz će biti:

 zbroj = 6 negacija = lažne argumente.duljina = 2

U gore navedenom programu test()metoda je preopterećena promjenom broja argumenata koje prihvaća.

Stvari koje treba zapamtiti dok koristite Varargs

Evo nekoliko stvari kojih biste se trebali sjetiti tijekom rada s Java vargarima:

1. Dok definirate potpis metode, uvijek napokon zadržite varargs.

Argument varijable mora biti zadnji argument prosljeđen metodi. Uzmimo u obzir, pozvali ste se na doSomething()metodu poput ove:

 doSomething (1, 2, 3, 4);

I, vaša doSomething()metoda je definirana kao:

 // netočna deklaracija metode public void doSomething (int … nums, int p) (// tijelo metode)

U ovom slučaju, kompajler ne može shvatiti broj argumenata prosljeđenih nums.

Međutim, ako definirate svoju metodu kao:

 javna void doSomething (int p, int … nums) (// tijelo metode)

Java kompajler prvi argument dodjeljuje p, a preostali intargumenti numeriraju se.

2. Metoda može imati samo jedan parametar varargs.

Na primjer, ova deklaracija metode je netočna:

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

Dvosmislenost u preopterećenju Varargove metode

Smatrajmo te preopterećenom test()metodom poput ove:

 klasa Demo (statički void test (int … vargs) (// tijelo metode) statički void test (int n, int … vargs) (// tijelo metode))

U gornjem programu kompajler se zbuni ako pokušate pozvati test()metodu iako su test()metode preopterećene i prihvaća različit broj argumenata.

Prevoditelj ne zna koju metodu pozvati. Prevoditelj može pomisliti, pokušavate nazvati test(int… vargs)s jednim argumentom varargs. Također, prevoditelj može pomisliti, pokušavate nazvati test(int n, int… vargs)s argumentom proslijeđenim prvom parametru s praznim drugim parametrom.

Budući da postoje dvije mogućnosti, to uzrokuje dvosmislenost. Zbog toga će vam ponekad trebati koristiti dva različita imena metoda umjesto preopterećenja metode varargs.

Zanimljivi članci...