programowanieProgramista Java

Co to jest varargs (argumenty o zmiennej długości) w Javie, jak działają i jakie pułapki istnieją przy ich używaniu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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

Jak to działa?

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:

  • Varargs musi być ostatnim parametrem na liście parametrów metody.
  • W jednej metodzie dozwolony jest tylko jeden parametr varargs.
  • Może wystąpić niejednoznaczność wywołania, jeśli istnieje przeciążenie między tablicą a varargs, a także między różnymi typami varargs.
  • Przy przekazywaniu null do varargs — metoda otrzyma null, a nie pustą tablicę!

Pytanie z haczykiem

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

Przykłady rzeczywistych błędów z powodu braku wiedzy na ten temat


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.