Para que servem as reticências (…) nesta assinatura de método?

203

Nos documentos do Google App Engine , para que servem as reticências ( JID...) nesta assinatura de método?

public MessageBuilder withRecipientJids(JID... recipientJids)

Qual é a função desses três pontos?

natchy
fonte
7
A propósito, tentei o caractere HORIZONTAL ELLIPSIS , Unicode U + 2026. O NetBeans 8 no Java 8 relata "caracteres ilegais". Portanto, os varargs Java requerem a tripla parada completa (ponto final) ...,.
Basil Bourque

Respostas:

208

Essas são varargs Java. Eles permitem passar qualquer número de objetos de um tipo específico (nesse caso, eles são do tipo JID).

No seu exemplo, as seguintes chamadas de função seriam 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);

Veja mais aqui: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

FrustratedWithFormsDesigner
fonte
16
Observe que os argumentos também podem ser passados ​​como uma matriz de JID (isso torna os varargs compatíveis com versões anteriores).
Mjn 13/03/10
54
Observe também que passar 0 varargs (nada) é legal.
Hawkeye Parker 28/06
9
Por último, mas não menos importante, o vararg deve ser o último parâmetro do método. Portanto, você não pode ter dois parâmetros vararg no mesmo método. Talvez você possa encontrar este método interessante. Docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain
62

A maneira de usar as reticências ou varargs dentro do método é como se fosse uma matriz:

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

Este método pode ser chamado da seguinte maneira:

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

Dentro PrintWithEllipsis, o tipo desetOfStrings é uma matriz de String. Então você pode economizar algum trabalho no compilador e passar uma matriz:

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

Para varargs métodos , um parâmetro de sequência é tratado como sendo uma matriz do mesmo tipo. Portanto, se duas assinaturas diferirem apenas, uma declara uma sequência e a outra uma matriz, como neste exemplo:

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

ocorre um erro em tempo de compilação.

Fonte: a especificação Java Programming Language , em que o termo técnico é variable arity parametermais do que o termo comum varargs.

Lucio
fonte
22

A notação de três pontos (...) é realmente emprestada da matemática e significa "... e assim por diante".

Quanto ao seu uso em Java, significa varargs, o que significa que qualquer número de argumentos pode ser adicionado à chamada do método. As únicas limitações são que elas varargsdevem estar no final da assinatura do método e só pode haver uma por método.

James Goodwin
fonte
5

Essas são varargseles são usados para criar um método que receber qualquer número de argumentos.

Por exemplo, o método PrintStream.printf o usa, pois você não sabe quantos argumentos usará.

Eles só podem ser usados ​​como posição final dos argumentos.

varargsfoi adicionado no Java 1.5

OscarRyz
fonte
3

Isso significa que o método aceita um número variável de argumentos ("varargs") do tipo JID. Dentro do método, recipientJidsé apresentado.

Isso é útil para casos em que você tem um método que pode opcionalmente manipular mais de um argumento de maneira natural e permite escrever chamadas que podem passar um, dois ou três parâmetros para o mesmo método, sem a feiura de criar uma matriz em tempo real.

Ele também permite idiomas como sprintfC; veja String.format(), por exemplo.

Roubar
fonte