ProgrammatieJava ontwikkelaar

Wat zijn varargs (variabele lengte argumenten) in Java, hoe werken ze en wat zijn de valkuilen bij het gebruik ervan?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Varargs is de syntaxis die een methode toelaat om een variabel aantal argumenten van één type te ontvangen. Ze worden gedeclareerd met behulp van een driepuntsnotatie:

public void printNames(String... names) { for (String name : names) { System.out.println(name); } }

Hoe werkt het?

Varargs parameter binnen een methode is gewoon — een array van het overeenkomstige type: String[] names in het bovenstaande voorbeeld. Je kunt de methode aanroepen met een willekeurig aantal argumenten of met een array:

printNames("Igor", "Anna", "Maria"); printNames(new String[] {"Alex", "Inna"});

Fijnere punten van gebruik:

  • Varargs moet de laatste parameter in de parameterlijst van de methode zijn.
  • In één methode is slechts één varargs parameter toegestaan.
  • Er kan onduidelijkheid zijn bij aanroep, als er overbelasting is tussen een array en varargs, evenals tussen verschillende types van varargs.
  • Bij het doorgeven van null aan varargs — de methode ontvangt null, niet een lege array!

Vragen met een valstrik

Vraag: Wat is de lengte van de varargs parameter array als je de methode aanroept zonder argumenten?

Antwoord: In dit geval zal de varargs variabele verwijzen naar een array van nul lengte: new String[0]. Het wordt niet null!

public void foo(Integer... args) { System.out.println(args.length); } // foo(); // Toont: 0

Voorbeelden van echte fouten door gebrek aan kennis over de fijne punten van het onderwerp


Geloof

In de logging bibliotheek was er een methode log(String... messages). Bij het aanroepen van log(null) ontstond er een NullPointerException binnen de methode (verwacht dat messages een lege array zou zijn, in plaats daarvan was het null). Dit leidde tot het expliciet controleren op null.


Geloof

De ontwikkelaar creëerde een overload:

public void doSomething(String[] arr) {...} public void doSomething(String... arr) {...}

Bij het doorgeven van een array, werd de verkeerde methode aangeroepen, wat leidde tot dataverlies. Het verschil tussen een array en varargs bleek onduidelijk te zijn.


Geloof

In het project werd er een tweede parameter na varargs toegevoegd:

public void foo(String... args, int count) {...} // Compilatiefout!

Dit leidde tot een fout en een mislukte build, omdat varargs de laatste moet zijn.