ProgrammierungJava-Entwickler

Was sind varargs (variable Argumente) in Java, wie funktionieren sie und welche Fallstricke gibt es bei ihrer Verwendung?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

Varargs ist eine Syntax, die es einer Methode ermöglicht, eine variable Anzahl von Argumenten desselben Typs zu empfangen. Sie werden mit drei Punkten deklariert:

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

Wie funktioniert das?

Der Varargs-Parameter innerhalb der Methode ist einfach ein Array des entsprechenden Typs: String[] names im obigen Beispiel. Die Methode kann mit beliebig vielen Argumenten oder mit einem Array aufgerufen werden:

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

Besonderheiten:

  • Varargs muss der letzte Parameter in der Parameterliste der Methode sein.
  • In einer Methode ist nur ein Varargs-Parameter erlaubt.
  • Es kann zu Mehrdeutigkeiten beim Aufruf kommen, wenn es Überladungen zwischen Arrays und Varargs sowie zwischen verschiedenen Typen von Varargs gibt.
  • Beim Übergeben von null an varargs erhält die Methode null und nicht ein leeres Array!

Fangfrage

Frage: Welche Länge hat das Array des Varargs-Parameters, wenn Sie die Methode ohne Argumente aufrufen?

Antwort: In diesem Fall wird die Variable varargs auf ein Array mit null Länge verweisen: new String[0]. Es wird nicht null sein!

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

Beispiele für echte Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

In der Logging-Bibliothek gab es eine Methode log(String... messages). Bei dem Aufruf log(null) trat ein NullPointerException innerhalb der Methode auf (man erwartete, dass messages ein leeres Array ist, stattdessen war es null). Um das zu lösen, musste explizit auf null überprüft werden.


Geschichte

Ein Entwickler erstellte eine Überladung:

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

Beim Übergeben eines Arrays wurde nicht die erwartete Methode aufgerufen, was zu einem Verlust von Daten führte. Der Unterschied zwischen Array und varargs war nicht offensichtlich.


Geschichte

Im Projekt wurde ein zweiter Parameter nach varargs hinzugefügt:

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

Dies führte zu einem Fehler und einem Build-Ausfall, da varargs der letzte sein muss.