2010-03-02 2 views
169

В App Engine docs, что такое многоточие (JID...) в этом методе?Что такое эллипсис (...) для этой сигнатуры метода?

public MessageBuilder withRecipientJids(JID... recipientJids) 

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

+5

Кстати, я попробовал символ HORIZONTAL ELLIPSIS, '...', Unicode U + 2026. NetBeans 8 в Java 8 сообщает «незаконный характер». Поэтому для Java varargs требуется тройной FULL STOP (период), '...'. –

ответ

178

Это 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

+13

Обратите внимание, что аргументы также могут передаваться как массив JID (это делает совместимым с varargs обратно). – mjn

+43

Также обратите внимание, что передача 0 varargs (ничего) является законной. –

+6

И последнее, но не менее важное: vararg должен быть последним параметром метода. Таким образом, вы не можете иметь два параметра vararg в том же методе. Возможно, вы можете найти этот метод интересным http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList%28T...%29 – BlackBrain

3

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

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

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

5

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

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

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

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

18

Три точки (...) обозначение фактически заимствована из математики, и это означает, что «... и так далее».

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

51

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

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.

+8

+1 для массива vs эллипсиса бит сигнатуры метода. – aspen100

2

Вы можете определить параметр, который может принимать переменные аргументы (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; 
    } 
} 

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