Java Varargs (spremenljivi argumenti) s primeri

V tem članku boste s pomočjo primerov izvedeli več o varargih v Javi. Naučili se boste tudi, kdaj uporabljati vararge in kdaj jih ne.

Kaj so varargi v Javi?

Recimo, da ustvarjate metodo Java. Vendar niste prepričani, koliko argumentov bo sprejela vaša metoda. Da bi rešili to težavo, je Java 1.5 predstavil varargs.

Varargs je kratko ime za spremenljive argumente. V Javi lahko argument metode sprejme poljubno število vrednosti. Ta argument, ki lahko sprejme spremenljivo število vrednosti, se imenuje varargs.

Sintaksa za izvajanje varargov je naslednja:

 accessModifier methodName (datatype… arg) (// telo metode)

Da bi definirali vararg, se v formalnem parametru metode uporablja (tri pike).

Metoda, ki zavzame spremenljivo število argumentov, se imenuje metoda s spremenljivo ariteto ali preprosto metoda varargs.

Najprej si oglejmo primer brez uporabe varargov:

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

Ko zaženete ta program, bo rezultat:

 3 6

Kot lahko jasno vidite, ste morali sumNumber()metodo preobremeniti, da je delovala za tri argumente.

Kaj če uporabnik želi dodati 5 številk ali 10 ali 100?

To je mogoče rešiti na lep način z uporabo varargov. Poglejmo primer kode:

Primer: Delovanje varargov

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

Ko zaženete program, bo rezultat:

 dolžina argumenta: 2 vsota2 = 6 dolžina argumenta: 3 vsota3 = 9 dolžina argumenta: 4 vsota4 = 16

Tu sumNumber()metoda vrne vsoto intparametrov, ki ji je bila posredovana (ni pomembno število predanih argumentov).

Kot lahko vidite, so lahko varargi v nekaterih situacijah res koristni. Če pa ste prepričani o številu argumentov, posredovanih metodi, namesto tega uporabite preobremenitev metode. Če ste na primer prepričani, da sumNumber()bo metoda uporabljena samo za izračun vsote 2 ali 3 argumentov, uporabite preobremenitev, kot v prvem primeru.

Vzemimo še en primer. Metoda format (), definirana v knjižnici Java, sprejema vararge. V JDK je format()metoda definirana na naslednji način:

 javni statični format niza (jezik l, format niza, predmet… argumenti) (// telo)

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

Ko zaženete program, bo rezultat:

 Ime spletnega mesta: programiz.com, število Emp: 6 Tip: spletno mesto z vadnicami 

Kako varargs deluje v ozadju?

Upoštevajmo naslednjo psevdo kodo:

 public int sumNumber (int… nums) (// telo metode)

Sintaksa pove Java prevajalnik, da se metoda lahko imenuje z nič ali več argumentov. Posledično je spremenljivka nums implicitno deklarirana kot polje tipa int( ). Tako je znotraj metode do spremenljivke nums dostopno s pomočjo sintakse matrike.

V primeru, da ni argumentov, je dolžina števil 0.

Preobremenitev Varargovih metod

Podobno kot pri običajnih metodah lahko tudi metode vararg preobremenite.

Priporočeno branje: Preobremenitev metode Java

Primer: Preobremenitev 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"); ) ) 

Ko zaženete program, bo rezultat:

 vsota = 6 negacija = napačni argumenti.dolžina = 2

V zgornjem programu je test()metoda preobremenjena s spreminjanjem števila sprejetih argumentov.

Stvari, ki si jih je treba zapomniti med uporabo Varargov

Tu je nekaj stvari, ki si jih morate zapomniti med delom z Java vargars:

1. Med definiranjem podpisa metode vedno shranite vararge.

Argument spremenljivke mora biti zadnji argument, ki je poslan metodi. Razmislimo, uporabili ste tako doSomething()metodo:

 doSomething (1, 2, 3, 4);

In vaša doSomething()metoda je definirana kot:

 // napačna deklaracija metode public void doSomething (int… nums, int p) (// telo metode)

V tem primeru prevajalnik ne more ugotoviti števila argumentov, posredovanih nums.

Če pa svojo metodo definirate kot:

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

Prevajalnik Java prvi argument dodeli p, preostali intargumenti pa številu.

2. Metoda ima lahko samo en parameter varargs.

Na primer, ta izjava metode ni pravilna:

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

Dvoumnost pri preobremenitvi metode Varargs

Razmislimo o preobremenjeni test()metodi, kot je ta:

 class Demo (statični preizkus praznine (int… vargs) (// telo metode) statični test praznine (int n, int… vargs) (// telo metode))

V zgornjem programu se prevajalnik zmede, če poskušate priklicati test()metodo, čeprav so test()metode preobremenjene in sprejme različno število argumentov.

Prevajalnik ne ve, katero metodo poklicati. Prevajalnik morda misli, da poskušate poklicati test(int… vargs)z enim argumentom varargs. Prevajalnik morda misli, da poskušate poklicati test(int n, int… vargs)z argumentom, ki je bil predan prvemu parametru s praznim drugim parametrom.

Ker obstajata dve možnosti, povzroča dvoumnost. Zaradi tega boste včasih morda morali uporabiti dve različni imeni metod, namesto da bi preobremenili metodo varargs.

Zanimive Članki...