Java Varargs (Variable Arguments) példákkal

Ebben a cikkben példák segítségével megismerheti a Java varargjait. Azt is megtanulja, mikor kell használni a varargokat, és mikor nem.

Mi a varargs a Java-ban?

Tegyük fel, hogy Java metódust hoz létre. Nem biztos azonban abban, hogy a metódusa hány érvet fog elfogadni. A probléma megoldására a Java 1.5 bevezette a varargokat.

A Varargs a változó argumentumok rövid neve. Java-ban egy metódus argumentuma tetszőleges számú értéket képes elfogadni. Ezt az argumentumot, amely képes változó számú értéket elfogadni, varargs-nak hívjuk.

A varargs végrehajtásának szintaxisa a következő:

 accessModifier methodName (adattípus… arg) (// metódustörzs)

A vararg meghatározásához (három pontot) használunk a módszer formális paraméterében.

A változó számú argumentumot felvevő metódust változó aritású metódusnak vagy egyszerűen csak varargs-metódusnak hívják.

Először nézzük meg a példát a varargs használata nélkül:

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

A program futtatásakor a kimenet a következő lesz:

 3 6

Mint jól látható, túl kellett tölteni a sumNumber()metódust, hogy 3 argumentumra működjön.

Mi van, ha a felhasználó 5 számot, vagy 10-et vagy 100-at akar hozzáadni?

Ez varargok használatával takarékosan kezelhető. Lássunk egy kódpéldát:

Példa: Varargok működése

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

A program futtatásakor a kimenet a következő lesz:

 argumentum hossza: 2 összeg2 = 6 argumentum hossza: 3 összeg3 = 9 argumentum hossza: 4 összeg4 = 16

Itt a sumNumber()metódus inta neki átadott paraméterek összegét adja vissza (nem számít az átadott argumentumok száma).

Mint látható, a varargs bizonyos helyzetekben valóban hasznos lehet. Ha azonban biztos abban, hogy a metódusnak hány argumentum érkezik, akkor inkább a módszer túlterhelését használta. Például, ha biztos abban, hogy ezt a sumNumber()módszert csak 2 vagy 3 argumentum összegének kiszámításához fogják használni, használja az első példához hasonlóan a túlterhelést.

Vegyünk egy másik példát. A Java könyvtárban definiált format () metódus elfogadja a varargokat. A JDK-ban a format()módszert a következőképpen határozzák meg:

 nyilvános statikus karakterlánc formátum (területi beállítás l, karakterlánc formátum, objektum… args) (// törzs)

Példa: format () módszer

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

A program futtatásakor a kimenet a következő lesz:

 Webhely neve: programiz.com, Emp Count: 6 Típus: oktató webhely 

Hogyan működik a varargs a színfalak mögött?

Vegyük fontolóra a következő álkódot:

 public int sumNumber (int… nums) (// módszer törzs)

A szintaxis azt mondja a Java fordítónak, hogy a metódust nulla vagy több argumentummal lehet meghívni. Ennek eredményeként a nums változót implicit módon típustömbbé deklaráljuk int( ). Így a módszer belsejében a nums változó a tömb szintaxisa segítségével érhető el.

Ha nincs argumentum, akkor a nullák hossza 0.

Varargs módszerek túlterhelése

A tipikus módszerekhez hasonlóan túlterhelheti a vararg módszereket.

Ajánlott olvasmány: Java módszer túlterhelése

Példa: Varargs-módszer túlterhelése

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

A program futtatásakor a kimenet a következő lesz:

 összeg = 6 negál = hamis arg. hosszúság = 2

A fenti programban a test()metódust túlterhelik az elfogadott argumentumok számának megváltoztatásával.

Emlékezetes dolgok a Varargs használata közben

Íme néhány dolog, amire emlékezned kell a Java változókkal való munka közben:

1. A módszer aláírásának definiálása közben mindig tartsa meg a varargokat.

A változó argumentumnak a módszernek utoljára átadott argumentumnak kell lennie. Vegyük fontolóra, hogy a következő doSomething()módszert hívta meg :

 doSomething (1, 2, 3, 4);

És a doSomething()módszer a következő:

 // helytelen metódus deklaráció public void doSomething (int… nums, int p) (// metódus törzs)

Ebben az esetben a fordító nem tudja kitalálni, hogy az argumentumok száma hány számot kapott.

Ha azonban a módszert a következőképpen határozza meg:

 public void doSomething (int p, int… nums) (// metódustörzs)

A Java fordító az első argumentumot hozzárendeli p-hez, a többi intargumentumot pedig a nums-hez.

2. Egy metódusnak csak egy varargs-paramétere lehet.

Például ez a módszer deklaráció hibás:

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

Kétértelműség a Varargs-módszer túlterhelésében

Vegyük fontolóra, hogy ilyen túlterhelt test()módszer:

 osztály Demo (static void test (int… vargs) (// method body) static void teszt (int n, int… vargs) (// method body))

A fenti programban a fordító összezavarodik, ha megpróbálja meghívni a test()módszert, annak ellenére, hogy a test()módszerek túlterheltek, és különböző számú argumentumot fogad el.

A fordító nem tudja, melyik módszert hívja meg. A fordító azt gondolhatja, hogy test(int… vargs)egy varargs argumentummal próbál meg hívni . A fordító azt gondolhatja, test(int n, int… vargs)hogy az első paraméterhez átadott argumentummal próbál meg hívni üres második paraméterrel.

Mivel két lehetőség van, ez kétértelműséget okoz. Emiatt néha két különböző metódusnevet kell használnia a varargs módszer túlterhelése helyett.

érdekes cikkek...