Varargs — specjalna składnia pozwalająca metodzie przyjmować zmienną (dowolną) liczbę argumentów jednego typu. W deklaracji metody taki parametr oznaczany jest jako Type... name (na przykład int... nums). Wewnątrz metody argumenty są traktowane jako zwykła tablica.
Przykład:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
Można wywołać tak:
printNumbers(1, 2, 3, 4); // lub printNumbers();
Wewnętrzna realizacja: przy wywołaniu metody z varargs kompilator automatycznie tworzy tablicę odpowiedniego typu.
Ograniczenia i niuanse:
printNumbers(null) spowoduje NPE przy próbie iteracji.Pytanie: "Czy można zadeklarować metodę z wieloma parametrami varargs?"
Często się myli: wielu myśli, że można zadeklarować public void example(int... a, String... b), ale spowoduje to błąd kompilacji.
Prawidłowa odpowiedź: Nie, możliwy jest tylko jeden parametr varargs, i musi być ostatni.
Historia
W korporacyjnej bibliotece logowania zrealizowano przeciążone wersje metod z varargs i tablicami. Przy przekazywaniu tablicy zamiast zestawu elementów zastosowano nie ten wariant metody, przez co tablica była logowana jako obiekt, a nie jej zawartość. Spowodowało to zamieszanie podczas analizy logów.
Historia
W serwisie integracyjnym wywołanie metody z varargs akceptowało null, nie sprawdzając na NPE. System niespodziewanie „ padał” przy próbie iteracji elementów, gdyż oczekiwano przynajmniej pustej tablicy.
Historia
W jednym z projektów e-commerce zamieszano w przeciążeniach metod: była metoda
send(String subject, String... emails)oraz inna —send(String subject, String[] emails). Przy przekazywaniu tablicy kompilator niejawnie wybierał nie tę metodę. Efekt: e-maile nie były wysyłane do klientów.