Varargs è una sintassi speciale che consente a un metodo di accettare un numero variabile (qualsiasi) di argomenti dello stesso tipo. Nella dichiarazione del metodo, tale parametro è contrassegnato come Type... name (ad esempio, int... nums). All'interno del metodo, gli argomenti sono trattati come un normale array.
Esempio:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
Puoi chiamarlo così:
printNumbers(1, 2, 3, 4); // oppure printNumbers();
Implementazione interna: quando si chiama un metodo con varargs, il compilatore crea automaticamente un array del tipo corrispondente.
Limitazioni e sfumature:
printNumbers(null) genererà NPE quando si tenta di iterare.Domanda: "È possibile dichiarare un metodo con più parametri varargs?"
Errore comune: molti pensano che si possa dichiarare public void example(int... a, String... b), ma questo genererà un errore di compilazione.
Risposta corretta: No, è possibile solo un parametro varargs e deve essere l'ultimo.
Storia
Nella libreria di logging aziendale sono state implementate versioni sovraccariche di metodi con varargs e array. Quando è stato passato un array invece di un insieme di elementi, è stata applicata la versione sbagliata del metodo, causando il logging dell'array come oggetto anziché del suo contenuto. Questo ha generato confusione nell'analisi dei log.
Storia
In un servizio di integrazione, la chiamata a un metodo con varargs accettava null, senza controllare per NPE. Il sistema si “bloccava” inaspettatamente quando tentava di iterare sugli elementi, poiché ci si aspettava almeno un array vuoto.
Storia
In un progetto di e-commerce, ci si è confusi con l'overloading dei metodi: c'era un metodo
send(String subject, String... emails)e un altro —send(String subject, String[] emails). Quando si passava un array, il compilatore sceglieva implicitamente il metodo sbagliato. Risultato: le email non venivano inviate ai clienti.