В App Engine docs, что такое многоточие (JID...
) в этом методе?Что такое эллипсис (...) для этой сигнатуры метода?
public MessageBuilder withRecipientJids(JID... recipientJids)
Какова функция этих трех точек?
В App Engine docs, что такое многоточие (JID...
) в этом методе?Что такое эллипсис (...) для этой сигнатуры метода?
public MessageBuilder withRecipientJids(JID... recipientJids)
Какова функция этих трех точек?
Это 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
Обратите внимание, что аргументы также могут передаваться как массив JID (это делает совместимым с varargs обратно). – mjn
Также обратите внимание, что передача 0 varargs (ничего) является законной. –
И последнее, но не менее важное: vararg должен быть последним параметром метода. Таким образом, вы не можете иметь два параметра vararg в том же методе. Возможно, вы можете найти этот метод интересным http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList%28T...%29 – BlackBrain
Это означает, что метод принимает variable number of arguments ("с переменным числом аргументов") типа JID
. В рамках метода представлен recipientJids
.
Это удобно для случаев, когда у вас есть метод, который может обрабатывать более одного аргумента естественным образом и позволяет писать вызовы, которые могут передавать один, два или три параметра одному и тому же методу, без уродство создания массива «на лету».
Он также позволяет использовать идиомы, такие как sprintf
от C; см. String.format()
, например.
Это varargs
они используются для создания метода, который получает любое количество аргументов.
Например, метод PrintStream.printf использует его, поскольку вы не знаете, сколько аргументов вы будете использовать.
Они могут использоваться только в качестве конечного положения аргументов.
varargs
был был добавлен на Java 1.5
Три точки (...) обозначение фактически заимствована из математики, и это означает, что «... и так далее».
Что касается его использования в Java, то это означает varargs
, что означает, что любое количество аргументов может быть добавлено к вызову метода. Единственные ограничения заключаются в том, что 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[] argsVar = {"first", "second"};
obj.PrintWithEllipsis(argsVar);
Для переменной длиной методов, параметры последовательности рассматриваются как массив того же типа.Таким образом, если две подписи отличаются только в том, что одна объявляет последовательность, а другой массив, как в этом примере:
void process(String[] s){}
void process(String...s){}
тогда происходит ошибка времени компиляции.
Источник: The Java Programming Language техническое описание, где технический термин variable arity parameter
, а не общий термин varargs
.
+1 для массива vs эллипсиса бит сигнатуры метода. – aspen100
Вы можете определить параметр, который может принимать переменные аргументы (varargs) в ваших методах. Ниже приведен пример класса Employee, который определяет метод daysOffWork, который принимает переменные аргументы:
class Employee {
public int daysOffWork(int... days) {
int daysOff = 0;
for (int i = 0; i < days.length; i++) {
daysOff += days[i];
}
return daysOff;
}
}
многоточие (...), который следует тип данных указывает на то, что параметр метода дней может быть прошла массив или несколько значений, разделенных запятыми.
Кстати, я попробовал символ HORIZONTAL ELLIPSIS, '...', Unicode U + 2026. NetBeans 8 в Java 8 сообщает «незаконный характер». Поэтому для Java varargs требуется тройной FULL STOP (период), '...'. –