Java Varargs (variabilní argumenty) s příklady

V tomto článku se dozvíte o varargech v Javě pomocí příkladů. Dozvíte se také, kdy použít varargy a kdy je nepoužívat.

Co je varargs v Javě?

Předpokládejme, že vytváříte metodu Java. Nejste si však jisti, kolik argumentů vaše metoda přijme. K vyřešení tohoto problému zavedla Java 1.5 varargs.

Varargs je zkrácený název pro argumenty proměnných. V Javě může argument metody přijímat libovolný počet hodnot. Tento argument, který může přijmout proměnný počet hodnot, se nazývá varargs.

Syntaxe pro implementaci varargs je následující:

 accessModifier methodName (datový typ … arg) (// tělo metody)

Aby bylo možné definovat vararg, (tři tečky) se používá ve formálním parametru metody.

Metoda, která bere proměnný počet argumentů, se nazývá metoda variabilní arity nebo jednoduše metoda varargs.

Nejprve se podívejme na příklad bez použití 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)); ) )

Když spustíte tento program, výstup bude:

 3 6

Jak jasně vidíte, museli jste přetížit sumNumber()metodu, aby fungovala na 3 argumenty.

Co když chce uživatel přidat 5 čísel nebo 10 nebo 100?

To lze řešit úhledným způsobem s použitím varargs. Podívejme se na příklad kódu:

Příklad: Práce s varargy

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

Když spustíte program, výstup bude:

 délka argumentu: 2 sum2 = 6 délka argumentu: 3 sum3 = 9 délka argumentu: 4 sum4 = 16

Zde sumNumber()metoda vrací součet intpředaných parametrů (nezáleží na počtu předaných argumentů).

Jak vidíte, varargy mohou být v některých situacích opravdu užitečné. Pokud si však jste jisti počtem argumentů předaných metodě, místo toho se použilo přetížení metody. Například pokud jste si jisti, že tato sumNumber()metoda bude použita pouze k výpočtu součtu buď 2 nebo 3 argumentů, použijte přetížení jako v prvním příkladu.

Vezměme si další příklad. Metoda format () definovaná v knihovně Java přijímá varargs. V JDK je format()metoda definována takto:

 public static String format (Locale l, String format, Object… args) (// body)

Příklad: 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 ) ); ) )

Když spustíte program, výstup bude:

 Název stránky: programiz.com, Emp Emp: 6 Typ: web s výukovým programem 

Jak funguje varargs v zákulisí?

Zvažme následující pseudokód:

 public int sumNumber (int… nums) (// tělo metody)

Syntaxe říká kompilátoru Java, že tato metoda může být volána s nulovou nebo více argumentů. Výsledkem je, že proměnná nums je implicitně deklarována jako pole typu int( ). Uvnitř metody je tedy k proměnné nums přistupováno pomocí syntaxe pole.

V případě neexistence argumentů je délka čísel 0.

Metody přetížení Varargs

Podobně jako u typických metod můžete přetížit varargové metody.

Doporučené čtení: Přetížení metody Java

Příklad: Přetížení metody 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"); ) ) 

Když spustíte program, výstup bude:

 sum = 6 negate = false args.length = 2

Ve výše uvedeném programu je test()metoda přetížena změnou počtu argumentů, které přijímá.

Na co si pamatovat při používání Varargs

Zde je několik věcí, které byste si měli pamatovat při práci s Java vargary:

1. Při definování podpisu metody vždy udržujte varargy konečně.

Argument proměnné musí být posledním argumentem předaným metodě. Uvažujme, že jste vyvolali doSomething()metodu takto:

 doSomething (1, 2, 3, 4);

A vaše doSomething()metoda je definována jako:

 // nesprávná deklarace metody public void doSomething (int… nums, int p) (// tělo metody)

V tomto případě kompilátor nemůže zjistit počet argumentů předaných číslům.

Pokud však definujete svoji metodu jako:

 public void doSomething (int p, int… nums) (// tělo metody)

The Java compiler assigns the first argument to p, and the remaining int arguments are assigned to nums.

2. A method can have only one varargs parameter.

For example, this method declaration is incorrect:

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

Ambiguity in Varargs Method overloading

Let’s consider you overloaded test() method like this:

 class Demo ( static void test(int… vargs) ( // method body ) static void test(int n, int… vargs) ( // method body ) )

In the above program, the compiler gets confused if you try to invoke the test() method even though test() methods are overloaded and accepts different number of arguments.

Kompilátor neví, kterou metodu volat. Kompilátor si může myslet, že se pokoušíte volat test(int… vargs)s jedním argumentem varargs. Kompilátor si také může myslet, že se pokoušíte volat test(int n, int… vargs)pomocí argumentu předaného prvnímu parametru s prázdným druhým parametrem.

Jelikož existují dvě možnosti, způsobuje to nejednoznačnost. Z tohoto důvodu někdy budete muset místo přetížení metody varargs použít dva různé názvy metod.

Zajímavé články...