Une méthode peut utiliser un paramètre varargs (argument variable) comme s’il s’agissait d’un tableau. Créer une méthode avec un paramètre varargs est un peu plus compliqué. En fait, l’appel d’une telle méthode peut ne pas utiliser un tableau du tout.
Créer des Méthodes avec Varargs
Il y a un certain nombre de règles importantes pour créer une méthode avec un paramètre varargs.
Règles pour Créer une Méthode avec un Paramètre Varargs
- Une méthode peut avoir au maximum un paramètre varargs.
- Si une méthode contient un paramètre varargs, il doit être le dernier paramètre dans la liste.
Étant donné ces règles, pouvez-vous identifier pourquoi chacune de ces méthodes compile ou ne compile pas?
public class VisiterAttractions {
public void marcher1(int... pas) {}
public void marcher2(int debut, int... pas) {}
public void marcher3(int... pas, int debut) {} // NE COMPILE PAS
public void marcher4(int... debut, int... pas) {} // NE COMPILE PAS
}
La méthode marcher1() est une déclaration valide avec un paramètre varargs. La méthode marcher2() est une déclaration valide avec un paramètre int et un paramètre varargs. Les méthodes marcher3() et marcher4() ne compilent pas car elles ont un paramètre varargs dans une position qui n’est pas la dernière.
Appeler des Méthodes avec Varargs
Lors de l’appel d’une méthode avec un paramètre varargs, vous avez le choix. Vous pouvez passer un tableau, ou vous pouvez lister les éléments du tableau et laisser Java le créer pour vous. Étant donné notre méthode marcher1() précédente, qui prend un paramètre varargs, nous pouvons l’appeler de deux façons :
// Passer un tableau
int[] donnees = new int[] {1, 2, 3};
marcher1(donnees);
// Passer une liste de valeurs
marcher1(1, 2, 3);
Quelle que soit la méthode que vous utilisez pour appeler la méthode, la méthode recevra un tableau contenant les éléments. Nous pouvons renforcer cela avec l’exemple suivant :
public void marcher1(int... pas) {
int[] pas2 = pas; // Pas nécessaire, mais montre que pas est de type int[]
System.out.print(pas2.length);
}
Vous pouvez même omettre les valeurs varargs dans l’appel de méthode, et Java créera un tableau de longueur zéro pour vous.
marcher1();
Accéder aux Éléments d’un Vararg
Accéder à un paramètre varargs est comme accéder à un tableau. Il utilise l’indexation de tableau. Voici un exemple :
public static void courir(int... pas) {
System.out.print(pas[1]);
}
public static void main(String[] args) {
courir(11, 77); // 77
}
La ligne qui appelle une méthode varargs avec deux paramètres. Lorsque la méthode est appelée, elle voit un tableau de taille 2. Comme les index commencent à zéro, 77 est imprimé.
Utiliser Varargs avec d’Autres Paramètres de Méthode
Enfin ! Vous allez faire autre chose que d’identifier si les déclarations de méthode sont valides. Au lieu de cela, vous allez examiner les appels de méthode. Pouvez-vous comprendre pourquoi chaque appel de méthode produit ce qu’il produit ? Pour l’instant, n’hésitez pas à ignorer le modificateur static dans la déclaration de méthode promenerChien() ; nous aborderons cela plus tard dans le chapitre.
public class PromeneurDeChien {
public static void promenerChien(int debut, int... pas) {
System.out.println(pas.length);
}
public static void main(String[] args) {
promenerChien(1); // 0
promenerChien(1, 2); // 1
promenerChien(1, 2, 3); // 2
promenerChien(1, new int[] {4, 5}); // 2
}
}
La ligne qui passe 1 comme debut mais rien d’autre. Cela signifie que Java crée un tableau de longueur 0 pour pas. La ligne qui passe 1 comme debut et une valeur supplémentaire. Java convertit cette valeur en un tableau de longueur 1. La ligne qui passe 1 comme debut et deux valeurs supplémentaires. Java convertit ces deux valeurs en un tableau de longueur 2. La ligne qui passe 1 comme debut et un tableau de longueur 2 directement comme pas.
Vous avez vu que Java créera un tableau vide si aucun paramètre n’est passé pour un vararg. Cependant, il est toujours possible de passer null explicitement. L’extrait suivant compile :
promenerChien(1, null); // Déclenche NullPointerException dans promenerChien()
Comme null n’est pas un int, Java le traite comme une référence de tableau qui se trouve être null. Il passe simplement l’objet tableau null à promenerChien(). Ensuite, la méthode promenerChien() lance une exception car elle essaie de déterminer la longueur de null.