Varargs to składnia umożliwiająca metodzie przyjmowanie zmiennej liczby argumentów jednego typu. Deklarowane są za pomocą wielokropka:
public void printNames(String... names) { for (String name : names) { System.out.println(name); } }
Parametr varargs wewnątrz metody to po prostu tablica odpowiedniego typu: String[] names w powyższym przykładzie. Można wywoływać metodę z dowolną liczbą argumentów lub z tablicą:
printNames("Igor", "Anna", "Maria"); printNames(new String[] {"Alex", "Inna"});
Szczegóły użycia:
Pytanie: Jaka będzie długość tablicy parametru varargs, jeśli wywołasz metodę bez przekazywania argumentów?
Odpowiedź: W tym przypadku zmienna varargs będzie odniesieniem do tablicy o zerowej długości: new String[0]. Nie będzie null!
public void foo(Integer... args) { System.out.println(args.length); } // foo(); // Wyświetli: 0
Historia
W bibliotece logowania był metod log(String... messages). Przy wywołaniu log(null) wystąpił NullPointerException wewnątrz metody (oczekiwano, że messages to pusty tablica, w rzeczywistości był null). W rezultacie konieczne było jawne sprawdzenie na null.
Historia
Programista stworzył przeciążenie:
public void doSomething(String[] arr) {...} public void doSomething(String... arr) {...}Przy przekazaniu tablicy wywołał się nie ten metod, którego oczekiwano, co doprowadziło do utraty części danych. Różnica między tablicą a varargs okazała się nieoczywista.
Historia
W projekcie dodano drugi parametr po varargs:
public void foo(String... args, int count) {...} // Błąd kompilacji!Doprowadziło to do błędu i przerwania budowy, ponieważ varargs musi być ostatni.