À quoi servent les points de suspension (…) dans cette signature de méthode?

203

Dans les documents App Engine , à quoi servent les points de suspension ( JID...) dans cette signature de méthode?

public MessageBuilder withRecipientJids(JID... recipientJids)

Quelle est la fonction de ces trois points?

natchy
la source
7
Au fait, j'ai essayé le caractère ELLIPSIS HORIZONTAL , Unicode U + 2026. NetBeans 8 en Java 8 signale un "caractère illégal". Donc , Java varargs exigent le triple point final (période), ....
Basil Bourque

Réponses:

208

Ce sont des varargs Java. Ils vous permettent de passer n'importe quel nombre d'objets d'un type spécifique (dans ce cas, ils sont de type JID).

Dans votre exemple, les appels de fonction suivants seraient valides:

MessageBuilder msgBuilder; //There should probably be a call to a constructor here ;)
MessageBuilder msgBuilder2;
msgBuilder.withRecipientJids(jid1, jid2);
msgBuilder2.withRecipientJids(jid1, jid2, jid78_a, someOtherJid);

Voir plus ici: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

FrustratedWithFormsDesigner
la source
16
Notez que les arguments peuvent également être passés sous la forme d'un tableau de JID (cela rend les varargs rétrocompatibles).
mjn
54
Notez également que le passage de 0 varargs (rien) est légal.
Hawkeye Parker
9
Enfin et surtout, le vararg doit être le dernier paramètre de la méthode. Ainsi, vous ne pouvez pas avoir deux paramètres vararg dans la même méthode. Peut-être que vous pouvez trouver cette méthode intéressante docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain
62

La façon d'utiliser les points de suspension ou les varargs à l'intérieur de la méthode est comme s'il s'agissait d'un tableau:

public void PrintWithEllipsis(String...setOfStrings) {
    for (String s : setOfStrings)
        System.out.println(s);
}

Cette méthode peut être appelée comme suit:

obj.PrintWithEllipsis(); // prints nothing
obj.PrintWithEllipsis("first"); // prints "first"
obj.PrintWithEllipsis("first", "second"); // prints "first\nsecond"

A l'intérieur PrintWithEllipsis, le type de setOfStringsest un tableau de String. Vous pouvez donc économiser du travail au compilateur et passer un tableau:

String[] argsVar = {"first", "second"};
obj.PrintWithEllipsis(argsVar);

Pour les méthodes varargs , un paramètre de séquence est traité comme étant un tableau du même type. Donc, si deux signatures diffèrent uniquement en ce que l'une déclare une séquence et l'autre un tableau, comme dans cet exemple:

void process(String[] s){}
void process(String...s){}

puis une erreur de compilation se produit.

Source: spécification du langage de programmation Java , où le terme technique est variable arity parameterplutôt que le terme commun varargs.

Lucio
la source
22

La notation à trois points (...) est en fait empruntée aux mathématiques et signifie "... et ainsi de suite".

Quant à son utilisation en Java, elle signifie varargs, ce qui signifie que n'importe quel nombre d'arguments peut être ajouté à l'appel de méthode. Les seules limitations sont que le varargsdoit être à la fin de la signature de la méthode et il ne peut y en avoir qu'une par méthode.

James Goodwin
la source
5

Ce sont varargselles qui sont utilisées pour créer une méthode qui reçoit un nombre quelconque d'arguments.

Par exemple, la méthode PrintStream.printf l' utilise, car vous ne savez pas combien d'arguments vous utiliserez.

Ils ne peuvent être utilisés que comme position finale des arguments.

varargsa été ajouté sur Java 1.5

OscarRyz
la source
3

Cela signifie que la méthode accepte un nombre variable d'arguments ("varargs") de type JID. Dans la méthode, recipientJidsest présenté.

C'est pratique dans les cas où vous avez une méthode qui peut éventuellement gérer plus d'un argument de manière naturelle, et vous permet d'écrire des appels qui peuvent passer un, deux ou trois paramètres à la même méthode, sans avoir la laideur de créer un tableau à la volée.

Il permet également des idiomes tels que ceux sprintfde C; voir String.format(), par exemple.

Rob
la source