Для чего нужен многоточие (...) в сигнатуре этого метода? - PullRequest
189 голосов
/ 03 марта 2010

В документах App Engine для чего используется многоточие (JID...) в сигнатуре этого метода?

public MessageBuilder withRecipientJids(JID... recipientJids)

Какова функция этих трех точек?

Ответы [ 5 ]

197 голосов
/ 03 марта 2010

Это Java Varargs. Они позволяют передавать любое количество объектов определенного типа (в данном случае это тип JID).

В вашем примере допустимы следующие вызовы функций:

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

Подробнее здесь: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

59 голосов
/ 04 мая 2014

Способ использования многоточия или varargs внутри метода, как если бы это был массив:

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

Этот метод может быть вызван следующим образом:

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

Внутри PrintWithEllipsis тип setOfStrings является массивом String. Таким образом, вы можете сэкономить компилятору некоторую работу и передать массив:

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

Для методов varargs параметр последовательности обрабатывается как массив того же типа. Так что, если две подписи отличаются только тем, что один объявляет последовательность, а другой - массив, как в этом примере:

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

тогда возникает ошибка времени компиляции.

Источник: Спецификация языка программирования Java , где техническим термином является variable arity parameter, а не общий термин varargs.

21 голосов
/ 03 марта 2010

Трехточечная (...) запись фактически заимствована из математики и означает «... и т. Д.».

Что касается его использования в Java, то оно означает varargs, что означает, что к вызову метода может быть добавлено любое количество аргументов. Единственным ограничением является то, что varargs должен быть в конце сигнатуры метода, и может быть только один на метод.

5 голосов
/ 03 марта 2010

Это varargs, они используются для создания метода, который получает любое количество аргументов.

Например, PrintStream.printf метод использует его, поскольку вы не знаете, сколько аргументов вы будете использовать.

Они могут использоваться только в качестве конечной позиции аргументов.

varargs был добавлен в Java 1.5

3 голосов
/ 03 марта 2010

Это означает, что метод принимает переменное число аргументов ("varargs") типа JID. В рамках метода представлено recipientJids.

Это удобно для случаев, когда у вас есть метод, который может опционально обрабатывать более одного аргумента естественным образом, и он позволяет записывать вызовы, которые могут передавать один, два или три параметра одному и тому же методу, не имея безобразие создания массива на лету.

Он также позволяет использовать такие идиомы, как sprintf от C; см. String.format(), например.

...