ProgrammazioneSviluppatore Java

Cosa sono i varargs (argomenti da lunghezza variabile) in Java, come funzionano e quali insidie esistono nel loro utilizzo?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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); } }

Come funziona?

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:

  • I varargs devono essere l'ultimo parametro nella lista dei parametri del metodo.
  • È consentito solo un parametro varargs in un metodo.
  • Ci possono essere ambiguità nella chiamata, se c'è un'overloading tra array e varargs, così come tra diversi tipi di varargs.
  • Quando si passa null a varargs, il metodo riceverà null, non un array vuoto!

Domanda insidiosa

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

Esempi di errori reali a causa della mancata conoscenza delle sfumature del tema


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.