ProgrammationDéveloppeur Java

Qu'est-ce que varargs (arguments à longueur variable) en Java, comment cela fonctionne-t-il et quels sont les pièges à éviter lors de son utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Varargs est une syntaxe qui permet à une méthode de recevoir un nombre variable d'arguments du même type. Ils sont déclarés à l'aide de trois points :

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

Comment cela fonctionne-t-il ?

Le paramètre varargs à l'intérieur de la méthode est simplement un tableau du type correspondant : String[] names dans l'exemple ci-dessus. Vous pouvez appeler la méthode avec n'importe quel nombre d'arguments ou avec un tableau :

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

Subtilités de l'utilisation :

  • Varargs doit être le dernier paramètre dans la liste des paramètres de la méthode.
  • Une seule paramètre varargs par méthode est autorisé.
  • Il peut y avoir des ambiguïtés d'appel s'il y a une surcharge entre un tableau et varargs, ainsi qu'entre différents types de varargs.
  • Lorsque vous passez null dans varargs, la méthode recevra null, pas un tableau vide !

Question piégée

Question : Quelle sera la longueur du tableau du paramètre varargs si vous appelez la méthode sans passer d'arguments ?

Réponse : Dans ce cas, la variable varargs sera une référence à un tableau de longueur nulle : new String[0]. Ce ne sera pas null !

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

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Dans une bibliothèque de journalisation, il y avait une méthode log(String... messages). Lors de l'appel de log(null), une NullPointerException est survenue à l'intérieur de la méthode (on s'attendait à ce que messages soit un tableau vide, au lieu de cela, il était null). Pour résoudre ce problème, il a fallu vérifier explicitement pour null.


Histoire

Un développeur a créé une surcharge :

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

Lors de la transmission d'un tableau, la méthode qui a été appelée n'était pas celle attendue, ce qui a conduit à une perte de données. La différence entre un tableau et varargs s'est révélée peu évidente.


Histoire

Dans le projet, un deuxième paramètre a été ajouté après varargs :

public void foo(String... args, int count) {...} // Erreur de compilation !

Cela a entraîné une erreur et un échec de la compilation, car varargs doit être le dernier.