¿Para qué sirven los puntos suspensivos (...) en la firma de este método?

203

En los documentos de App Engine , ¿qué son los puntos suspensivos (JID... ) en la firma de este método?

public MessageBuilder withRecipientJids(JID... recipientJids)

¿Cuál es la función de esos tres puntos?

Natchy
fuente
77
Por cierto, probé el personaje ELLIPSIS HORIZONTAL , Unicode U + 2026. NetBeans 8 en Java 8 informa de "carácter ilegal". Así Java varargs requerir la triple punto (período), ....
Basil Bourque

Respuestas:

208

Esos son los varargs de Java. Le permiten pasar cualquier cantidad de objetos de un tipo específico (en este caso, son de tipo JID).

En su ejemplo, las siguientes llamadas a funciones serían válidas:

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

Ver más aquí: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

FrustratedWithFormsDesigner
fuente
16
Tenga en cuenta que los argumentos también se pueden pasar como una matriz de JID (esto hace que los varargs sean compatibles con versiones anteriores).
mjn
54
También tenga en cuenta que pasar 0 varargs (nada) es legal.
Hawkeye Parker
9
Por último, pero no menos importante, el vararg debe ser el último parámetro del método. Por lo tanto, no puede tener dos parámetros vararg en el mismo método. Tal vez, este método le resulte
BlackBrain
62

La forma de utilizar puntos suspensivos o varargs dentro del método es como si fuera una matriz:

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

Este método se puede llamar de la siguiente manera:

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

En PrintWithEllipsisel interior , el tipo de setOfStringses una matriz de cadenas. Para que pueda guardar el compilador algo de trabajo y pasar una matriz:

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

Para varargs métodos , un parámetro de secuencia se trata como una matriz del mismo tipo. Entonces, si dos firmas difieren solo en que una declara una secuencia y la otra una matriz, como en este ejemplo:

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

entonces se produce un error en tiempo de compilación.

Fuente: La especificación del lenguaje de programación Java , donde el término técnico es variable arity parametermás que el término común varargs.

Lucio
fuente
22

La notación de tres puntos (...) se toma prestada de las matemáticas y significa "... y así sucesivamente".

En cuanto a su uso en Java, significa varargs, lo que significa que se puede agregar cualquier número de argumentos a la llamada al método. Las únicas limitaciones son que varargsdeben estar al final de la firma del método y solo puede haber una por método.

James Goodwin
fuente
5

Esos son los varargsque se utilizan para crear un método que recibe cualquier número de argumentos.

Por ejemplo, el método PrintStream.printf lo usa, ya que no sabes cuántos argumentos usarías .

Solo pueden usarse como posición final de los argumentos.

varargsfue agregado en Java 1.5

OscarRyz
fuente
3

Significa que el método acepta un número variable de argumentos ("varargs") de tipo JID. Dentro del método, recipientJidsse presenta.

Esto es útil para los casos en que tiene un método que puede manejar opcionalmente más de un argumento de forma natural, y le permite escribir llamadas que pueden pasar uno, dos o tres parámetros al mismo método, sin tener la fealdad de crear Una matriz sobre la marcha.

También permite modismos tales como sprintfde C; ver String.format(), por ejemplo.

Robar
fuente