I varargs sono una sintassi che consente a un metodo di ricevere un numero variabile di argomenti dello stesso tipo. Sono dichiarati usando i tre puntini:
public void printNames(String... names) { for (String name : names) { System.out.println(name); } }
Il parametro varargs all'interno del metodo è semplicemente un array del tipo corrispondente: String[] names nell'esempio sopra. Puoi chiamare il metodo con qualsiasi numero di argomenti o con un array:
printNames("Igor", "Anna", "Maria"); printNames(new String[] {"Alex", "Inna"});
Sfumature dell'utilizzo:
Domanda: Quale sarà la lunghezza dell'array del parametro varargs, se chiami il metodo senza passare argomenti?
Risposta: In questo caso, la variabile varargs sarà un riferimento a un array di lunghezza zero: new String[0]. Non sarà null!
public void foo(Integer... args) { System.out.println(args.length); } // foo(); // Stampa: 0
Storia
Nella libreria di logging c'era un metodo log(String... messages). Quando veniva chiamato log(null), si verificava un NullPointerException all'interno del metodo (si aspettava che messages fosse un array vuoto, invece era null). Per risolvere, è stato necessario controllare esplicitamente per null.
Storia
Uno sviluppatore ha creato un overload:
public void doSomething(String[] arr) {...} public void doSomething(String... arr) {...}Quando è stato passato un array, è stato chiamato il metodo sbagliato, portando alla perdita di parte dei dati. La differenza tra array e varargs si è rivelata non ovvia.
Storia
Nel progetto è stato aggiunto un secondo parametro dopo varargs:
public void foo(String... args, int count) {...} // Errore di compilazione!Questo ha portato a un errore e al fallimento della build, perché i varargs devono essere ultimi.