Varargs — een speciale syntaxis die een methode in staat stelt om een variabel (enig) aantal argumenten van hetzelfde type te accepteren. In de declaratie van de methode wordt zo'n parameter aangeduid als Type... naam (bijvoorbeeld int... nums). Binnen de methode worden de argumenten gezien als een normale array.
Voorbeeld:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
Je kunt het zo aanroepen:
printNumbers(1, 2, 3, 4); // of printNumbers();
Interne implementatie: bij het aanroepen van een methode met varargs creëert de compiler automatisch een array van het juiste type.
Beperkingen en nuances:
printNumbers(null) zal een NPE veroorzaken bij het proberen te itereren.Vraag: "Kan je een methode met meerdere varargs-parameters declareren?"
Dikwijls misvoren: velen denken dat je public void example(int... a, String... b) kunt declareren, maar dit zal een compilatiefout veroorzaken.
Juiste antwoord: Nee, er kan maar één varargs-parameter zijn, en deze moet de laatste zijn.
Verhaal
In de bedrijfslogboekbibliotheek werden overbelaste versies van methoden met varargs en arrays geïmplementeerd. Bij het doorgeven van een array in plaats van een set elementen werd niet de goede versie van de methode toegepast, waardoor de array als object werd gelogd, en niet als de inhoud. Dit veroorzaakte verwarring bij het analyseren van logs.
Verhaal
In de integratieservice accepteerde het aanroepen van een methode met varargs null, zonder op NPE te controleren. Het systeem "viel" onverwachts uit bij het proberen te itereren over elementen, aangezien ten minste een lege array werd verwacht.
Verhaal
In een e-commerce project raakten ze in de knoop met de overbelastingen van methoden: er was een methode
send(String subject, String... emails)en een andere —send(String subject, String[] emails). Bij het doorgeven van een array koos de compiler impliciet niet de juiste methode. Resultaat: e-mails werden niet naar klanten verzonden.