Java Varargs (argumenty zmiennych) z przykładami

W tym artykule dowiesz się o varargach w Javie na podstawie przykładów. Dowiesz się również, kiedy używać varargów, a kiedy ich nie używać.

Co to jest varargs w Javie?

Załóżmy, że tworzysz metodę Java. Nie jesteś jednak pewien, ile argumentów przyjmie Twoja metoda. Aby rozwiązać ten problem, Java 1.5 wprowadziła varargs.

Varargs to krótka nazwa argumentów zmiennych. W Javie argument metody może przyjmować dowolną liczbę wartości. Ten argument, który może akceptować zmienną liczbę wartości, nazywa się varargs.

Składnia implementacji varargs jest następująca:

 accessModifier methodName (typ danych… arg) (// treść metody)

Aby zdefiniować vararg, (trzy kropki) są używane w formalnym parametrze metody.

Metoda, która przyjmuje zmienną liczbę argumentów, nazywana jest metodą zmiennej arity lub po prostu metodą varargs.

Najpierw spójrzmy na przykład bez użycia 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)); ) )

Po uruchomieniu tego programu wynik będzie następujący:

 3 6

Jak widać, trzeba było przeciążać sumNumber()metodę, aby działała dla 3 argumentów.

Co jeśli użytkownik chce dodać 5 liczb lub 10 lub 100?

Można to zręcznie załatwić za pomocą varargów. Zobaczmy przykład kodu:

Przykład: działanie varargs

 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 uruchomieniu programu wynik będzie następujący:

 długość argumentów: 2 sum2 = 6 długość argumentów: 3 sum3 = 9 długość argumentów: 4 sum4 = 16

Tutaj sumNumber()metoda zwraca sumę intprzekazanych do niej parametrów (nie ma znaczenia liczba przekazanych argumentów).

Jak widać, w niektórych sytuacjach varargy mogą być naprawdę przydatne. Jeśli jednak masz pewność co do liczby argumentów przekazanych do metody, zamiast tego zastosuj przeciążenie metody. Na przykład, jeśli masz pewność, że sumNumber()metoda zostanie użyta tylko do obliczenia sumy 2 lub 3 argumentów, użyj przeciążenia, jak w pierwszym przykładzie.

Weźmy inny przykład. Metoda format () zdefiniowana w bibliotece Java akceptuje zmienne vararg. W JDK format()metoda jest zdefiniowana następująco:

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

Przykład: 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 ) ); ) )

Po uruchomieniu programu wynik będzie następujący:

 Nazwa witryny: programiz.com, Emp Liczba: 6 Typ: witryna samouczka 

Jak działa Varargs za kulisami?

Rozważmy następujący pseudokod:

 public int sumNumber (int… nums) (// treść metody)

Składnia informuje kompilator Javy, że metoda ta może być wywołana z zero lub więcej argumentów. W rezultacie zmienna nums jest niejawnie zadeklarowana jako tablica typu int( ). Zatem wewnątrz metody dostęp do zmiennej nums uzyskuje się za pomocą składni tablicy.

W przypadku braku argumentów długość liczb wynosi 0.

Przeciążanie metod Varargsa

Podobnie jak w przypadku typowych metod, możesz przeciążać metody vararg.

Zalecana literatura: Przeciążanie metod Java

Przykład: Przeciążanie metody Varargsa

 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 uruchomieniu programu wynik będzie następujący:

 sum = 6 negate = false args.length = 2

W powyższym programie test()metoda jest przeciążana przez zmianę liczby przyjmowanych argumentów.

O czym należy pamiętać podczas korzystania z Varargs

Oto kilka rzeczy, o których należy pamiętać podczas pracy z Java Vargars:

1. Definiując sygnaturę metody, zawsze zachowuj na końcu varargs.

Argument zmiennej musi być ostatnim argumentem przekazanym do metody. Rozważmy, że wywołałeś doSomething()taką metodę:

 doSomething (1, 2, 3, 4);

Twoja doSomething()metoda jest zdefiniowana jako:

 // niepoprawna deklaracja metody public void doSomething (int… nums, int p) (// treść metody)

W tym przypadku kompilator nie może obliczyć liczby argumentów przekazanych do nums.

Jeśli jednak zdefiniujesz swoją metodę jako:

 public void doSomething (int p, int… nums) (// treść metody)

Kompilator Java przypisuje pierwszy argument do p, a pozostałe intargumenty do liczby.

2. Metoda może mieć tylko jeden parametr varargs.

Na przykład ta deklaracja metody jest niepoprawna:

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

Niejednoznaczność w przeciążaniu metody Varargsa

Rozważmy test()taką przeciążoną metodę:

 class Demo (static void test (int… vargs) (// treść metody) static void test (int n, int… vargs) (// treść metody))

W powyższym programie kompilator jest zdezorientowany, jeśli spróbujesz wywołać test()metodę, mimo że test()metody są przeciążone i akceptuje różną liczbę argumentów.

Kompilator nie wie, którą metodę wywołać. Kompilator może pomyśleć, że próbujesz wywołać test(int… vargs)z jednym argumentem varargs. Ponadto kompilator może pomyśleć, że próbujesz wywołać test(int n, int… vargs)z argumentem przekazanym do pierwszego parametru z pustym drugim parametrem.

Ponieważ istnieją dwie możliwości, powoduje to niejednoznaczność. Z tego powodu czasami może być konieczne użycie dwóch różnych nazw metod zamiast przeciążania metody varargs.

Interesujące artykuły...