Для чого є еліпсис (…) у підписі цього методу?


203

У документах App Engine , для чого підписаний еліпсис ( JID...) у цьому способі?

public MessageBuilder withRecipientJids(JID... recipientJids)

Яка функція цих трьох крапок?


7
До речі, я спробував символ HORIZONTAL ELLIPSIS,, Unicode U + 2026. NetBeans 8 в Java 8 повідомляє про "незаконний характер". Таким чином , Java вимагає змінною довжиною потрійний повної зупинки (період), ....
Василь Бурк

Відповіді:


208

Це вараги Java. Вони дозволяють передавати будь-яку кількість об'єктів певного типу (у цьому випадку вони типу 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


16
Зауважте, що аргументи також можуть передаватися як масив JID (це робить varargs назад сумісними).
mjn

54
Також зауважте, що проходження 0 вараг (нічого) не є законним.
Хокі Паркер

9
І останнє, але не менш важливе значення, вараг повинен бути останнім параметром методу. Отже, ви не можете мати два параметри vararg в одному методі. Можливо, ви можете знайти цей метод цікавим docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain

62

Спосіб використання еліпсису або варагрів всередині методу такий, як ніби це масив:

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.


22

Позначення трьох крапок (...) насправді запозичено з математики, і це означає "... і так далі".

Що стосується його використання в Java, то воно означає varargs, що до виклику методу може бути додано будь-яку кількість аргументів. Єдині обмеження полягають у тому, що вони varargsповинні бути в кінці підпису методу, а в методі може бути лише один.


5

Саме varargsвони використовуються для створення методу, який отримує будь-яку кількість аргументів.

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

Вони можуть бути використані лише як остаточне положення аргументів.

varargsдодано на Java 1.5


3

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

Це зручно для тих випадків, коли у вас є метод, який може необов'язково обробляти більш ніж один аргумент природним способом і дозволяє писати дзвінки, які можуть передавати один, два або три параметри того ж методу, не маючи неподобства створювати масив на льоту.

Це також дозволяє ідіоми, такі як sprintfвід C; див. String.format(), наприклад.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.