Java Varargs (variabilné argumenty) s príkladmi

V tomto článku sa dozviete o varargoch v Jave pomocou príkladov. Dozviete sa tiež, kedy použiť varargy a kedy ich nepoužívať.

Čo je varargs v Jave?

Predpokladajme, že vytvárate metódu Java. Nie ste si však istí, koľko argumentov vaša metóda prijme. Na riešenie tohto problému predstavila Java 1.5 varargy.

Varargs je krátky názov pre argumenty premenných. V Jave môže argument metódy akceptovať ľubovoľný počet hodnôt. Tento argument, ktorý dokáže prijať premenný počet hodnôt, sa nazýva varargs.

Syntax pre implementáciu varargs je nasledovná:

 accessModifier methodName (datatype… arg) (// telo metódy)

Na definovanie vararg sa vo formálnom parametri metódy používa (tri bodky).

Metóda, ktorá berie premenlivý počet argumentov, sa nazýva metóda variabilnej arity alebo jednoducho metóda varargs.

Najprv sa pozrime na príklad bez použitia 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)); ) )

Keď spustíte tento program, výstup bude:

 3 6

Ako môžete jasne vidieť, museli ste preťažiť sumNumber()metódu, aby fungovala na 3 argumenty.

Čo ak chce používateľ pridať 5 čísel alebo 10 alebo 100?

To sa dá vyriešiť úhľadne s použitím varargov. Pozrime sa na príklad kódu:

Príklad: práca s varargmi

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

Po spustení programu bude výstup:

 dĺžka argumentu: 2 súčet2 = 6 dĺžka argumentu: 3 súčet3 = 9 dĺžka argumentu: 4 súčet4 = 16

Tu sumNumber()metóda vráti súčet intparametrov, ktoré jej boli odovzdané (nezáleží na počte odovzdaných argumentov).

Ako vidíte, varargy môžu byť v niektorých situáciách skutočne užitočné. Ak ste si však istí počtom argumentov odovzdaných metóde, namiesto toho sa použilo preťaženie metódy. Napríklad, ak ste si istí, že táto sumNumber()metóda sa použije iba na výpočet súčtu buď 2 alebo 3 argumentov, použite preťaženie ako v prvom príklade.

Zoberme si ďalší príklad. Metóda format () definovaná v knižnici Java akceptuje varargs. V JDK je format()metóda definovaná takto:

 verejný statický formát reťazca (miestne nastavenie l, formát reťazca, objekt … args) (// telo)

Príklad: metóda 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 ) ); ) )

Po spustení programu bude výstup:

 Názov stránky: programiz.com, Emp Empty: 6 Typ: výukový web 

Ako funguje varargs v zákulisí?

Zvážme nasledujúci pseudokód:

 public int sumNumber (int… nums) (// telo metódy)

Syntax hovorí kompilátora Java, že táto metóda môže byť volaná s nulovou alebo viacerými argumentov. Vo výsledku je premenná nums implicitne deklarovaná ako pole typu int( ). Vo vnútri metódy je teda k premennej nums pristupované pomocou syntaxe poľa.

V prípade, že neexistujú žiadne argumenty, je dĺžka čísel 0.

Metódy preťaženia Varargs

Podobne ako pri bežných metódach, aj pri nich môžete varargové metódy preťažiť.

Odporúčané čítanie: Preťaženie metód Java

Príklad: Preťaženie metódy 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"); ) ) 

Po spustení programu bude výstup:

 sum = 6 negate = false args.length = 2

Vo vyššie uvedenom programe je test()metóda preťažená zmenou počtu argumentov, ktoré prijíma.

Na čo treba pamätať pri používaní Varargs

Tu je niekoľko vecí, ktoré by ste si mali pamätať pri práci s programami Java Vargars:

1. Pri definovaní podpisu metódy vždy udržujte varargy konečne.

Argument premenná musí byť posledným argumentom odovzdaným metóde. Uvažujme, že ste vyvolali doSomething()metódu takto:

 doSomething (1, 2, 3, 4);

A vaša doSomething()metóda je definovaná ako:

 // nesprávna deklarácia metódy public void doSomething (int… nums, int p) (// telo metódy)

V takom prípade kompilátor nemôže zistiť počet argumentov odovzdaných číslam.

Ak však definujete svoju metódu ako:

 public void doSomething (int p, int … nums) (// telo metódy)

Kompilátor Java priradí prvý argument p a zostávajúce intargumenty priradí číslam.

2. Metóda môže mať iba jeden parameter varargs.

Toto vyhlásenie o metóde je napríklad nesprávne:

 int doSomething (int p, float … floatNums, double … doubleNums) (// kód)

Nejednoznačnosť vo preťažení Varargsovej metódy

Uvažujme o test()tejto preťaženej metóde, ako je táto:

 trieda Demo (test statickej neplatnosti (int … vargs) (// telo metódy) test statickej neplatnosti (int n, int … vargs) (// telo metódy))

Vo vyššie uvedenom programe je kompilátor zmätený, ak sa pokúsite vyvolať test()metódu, aj keď test()sú metódy preťažené a prijíma rôzny počet argumentov.

Kompilátor nevie, ktorý spôsob má zavolať. Kompilátor si môže myslieť, že sa pokúšate volať test(int… vargs)pomocou jedného argumentu varargs. Kompilátor si tiež môže myslieť, že sa pokúšate zavolať test(int n, int… vargs)pomocou argumentu odovzdaného prvému parametru s prázdnym druhým parametrom.

Keďže existujú dve možnosti, spôsobuje to nejednoznačnosť. Z tohto dôvodu niekedy budete musieť namiesto preťaženia metódy varargs použiť dva rôzne názvy metód.

Zaujímavé články...