916 votes

Que signifient les 3 points à côté d'un type de paramètre en Java ?

Que signifient les 3 points suivants String dans la méthode suivante ?

public void myMethod(String... strings){
    // method body
}

1105voto

kiswa Points 3542

Cela signifie que zéro ou plusieurs objets String (ou un seul tableau de ceux-ci) peuvent être passés comme argument(s) pour cette méthode.

Voir la section "Nombre arbitraire d'arguments" ici : http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

Dans votre exemple, vous pourriez l'appeler de l'une des manières suivantes :

myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});

Note importante : Le ou les arguments passés de cette manière sont toujours un tableau - même s'il n'y en a qu'un seul. Assurez-vous de le traiter de cette façon dans le corps de la méthode.

Note importante 2 : L'argument qui obtient le ... doit être le dernier de la signature de la méthode. Donc, myMethod(int i, String... strings) c'est bon, mais myMethod(String... strings, int i) n'est pas acceptable.

Merci à Vash pour les précisions apportées dans son commentaire.

2 votes

J'aurais aimé que cela fonctionne aussi. myMethod("one", "two", "three", new String[] {"a", "b", "c""}) ;

3 votes

Pourquoi pouvez-vous donner 0 paramètre à la méthode ? Cela conduira très probablement à l'exception ArrayIndexOutOfBoundsException. Maintenant, vous devez toujours prendre ce cas en considération.

12 votes

Parce qu'ils sont optionnels. C'est au développeur qui a décidé d'utiliser des arguments optionnels d'implémenter correctement la méthode pour gérer le fait d'en avoir zéro ou plus.

135voto

Cristian Points 92147

Cette fonction est appelée varargs Il s'agit d'une fonctionnalité introduite dans Java 5. Cela signifie que la fonction peut recevoir plusieurs String arguments :

myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array

Ensuite, vous pouvez utiliser le String var comme un tableau :

public void myMethod(String... strings){
    for(String whatever : strings){
        // do what ever you want
    }

    // the code above is equivalent to
    for( int i = 0; i < strings.length; i++){
        // classical for. In this case you use strings[i]
    }
}

Cette réponse emprunte beaucoup à celles de kiswa et de Lorenzo... et aussi au commentaire de Graphain.

17 votes

Quand le code frappe le bytecode, il es un tableau. Tout le reste est une syntaxe supportée uniquement par le compilateur.

0 votes

Cette réponse emprunte beaucoup à celles de Kiswa et de Lorenzo si je lis correctement les éditions.

3 votes

Il est préférable d'éditer votre réponse et de la rendre plus correcte que de la laisser telle quelle. Et si une autre réponse est à l'origine de votre amélioration, il en va ainsi. Au moins, il est honnête à ce sujet (et je suppose qu'il a upvoted les autres réponses qui l'ont aidé... non ?).

15voto

Lorenzo Points 2772

C'est la façon Java de passer varargs (arguments à nombre variable).

Si vous êtes familier avec le langage C, ceci est similaire à la fonction ... syntaxe utilisée dans le printf fonction :

int printf(const char * format, ...);

mais d'une manière sûre : chaque argument doit être conforme au type spécifié (dans votre exemple, ils devraient être tous des String ).

Il s'agit d'un simple exemple de la manière dont vous pouvez utiliser varargs :

class VarargSample {

   public static void PrintMultipleStrings(String... strings) {
      for( String s : strings ) {
          System.out.println(s);
      }
   }

   public static void main(String[] args) {
      PrintMultipleStrings("Hello", "world");
   }
}

El ... est en fait un tableau, de sorte que vous pouvez passer un fichier String[] comme paramètre.

13voto

micstas Points 181

On peut dire que c'est un exemple de sucre syntaxique, puisqu'il est implémenté comme un tableau de toute façon (ce qui ne veut pas dire qu'il est inutile) - je préfère passer un tableau pour que ce soit clair, et aussi déclarer des méthodes avec des tableaux de type donné. C'est plutôt une opinion qu'une réponse, cependant.

4voto

Ε Г И І И О Points 1582

Pensez-y comme le mot-clé params en C#, si vous venez de ce milieu :)

0 votes

Je suis un programmeur C#.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X