2010-03-02 15 views
169

En el App Engine docs, ¿cuál es la elipsis (JID...) para este método de firma?¿Cuál es la elipsis (...) para la firma de este método?

public MessageBuilder withRecipientJids(JID... recipientJids) 

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

+5

Por cierto, probé el carácter HORIZONTAL ELLIPSIS, '...', Unicode U + 2026. NetBeans 8 en Java 8 informa "carácter ilegal". Entonces los varargs de Java requieren el triple FULL STOP (punto), '...'. –

Respuesta

178

Esas son 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

+13

Tenga en cuenta que los argumentos también se pueden pasar como una matriz de JID (esto hace que varargs sea compatible con versiones anteriores). – mjn

+43

También tenga en cuenta que pasar 0 varargs (nada) es legal. –

+6

Por último pero no menos importante, 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, puede encontrar este método interesante http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList%28T...%29 – BlackBrain

3

Esto significa que el método acepta un variable number of arguments ("varargs") de tipo JID. Dentro del método, se presenta recipientJids.

Esto es útil para casos en los 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 como sprintf de C; ver String.format(), por ejemplo.

5

Esos son varargs 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 sabe cuántos argumentos usaría.

Solo se pueden usar como posición final de los argumentos.

varargs se se añadió en Java 1.5

18

La notación de tres puntos (...) es en realidad tomado 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 cantidad de argumentos a la llamada al método. Las únicas limitaciones son que el varargs debe estar al final de la firma del método y solo puede haber uno por método.

51

La manera de utilizar los 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 puede ser llamado como siguiente:

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

Dentro PrintWithEllipsis, el tipo de setOfStrings es una matriz de Cadena. por lo que podría salvar el compilador algo de trabajo y pasar un array:

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

Para varargs métodos, un parámetro de secuencia se trata como si fuera una matriz del mismo tipo.Así que si dos firmas difieren solamente en que uno declara una secuencia y el otro una matriz, como en este ejemplo:

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

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

Fuente: The Java Programming Language especificación, donde el término técnico es variable arity parameter en lugar del término común varargs.

+8

+1 para la matriz frente a puntos suspensivos bit de firma del método. – aspen100

2

Puede definir un parámetro que pueda aceptar argumentos variables (varargs) en sus métodos. Lo que sigue es un ejemplo de clase Empleado, que define un daysOffWork método que acepta argumentos variables:

class Employee { 
    public int daysOffWork(int... days) { 
     int daysOff = 0; 
     for (int i = 0; i < days.length; i++) { 
      daysOff += days[i]; 
     } 
     return daysOff; 
    } 
} 

los puntos suspensivos (...) que sigue el tipo de datos indica que el parámetro método día pueden pasar una matriz o valores separados por comas múltiples.

Cuestiones relacionadas