programowanieBackend Java deweloper

Czym są varargs (argumenty zmiennej długości) w Javie, jak działa ich wewnętrzna realizacja i jakie istnieją niuanse oraz ograniczenia przy ich użyciu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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:

  • Parametr varargs może być tylko jeden i zawsze musi być ostatni na liście parametrów.
  • Rozszerzenie varargs (Type...) w rzeczywistości jest tablicą (Type[]).
  • Przekazywanie null: printNumbers(null) spowoduje NPE przy próbie iteracji.
  • Przeciążenie metod z varargs może prowadzić do niejednoznaczności wywołań.

Pytanie z podstępem

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.

Przykłady rzeczywistych błędów z powodu braku znajomości niuansów tematu


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.