Do czego służy elipsa (…) w podpisie tej metody?

203

W dokumentach App Engine , do czego służy ellipsis ( JID...) w sygnaturze tej metody?

public MessageBuilder withRecipientJids(JID... recipientJids)

Jaka jest funkcja tych trzech kropek?

natchny
źródło
7
Nawiasem mówiąc, wypróbowałem HORIZONTAL ELLIPSIS , Unicode U + 2026. NetBeans 8 w Javie 8 zgłasza „nielegalny charakter”. Tak Java varargs wymagają potrójne kropkę (kropka), ....
Basil Bourque,

Odpowiedzi:

208

To są varargs Java. Pozwalają przekazać dowolną liczbę obiektów określonego typu (w tym przypadku są one typu JID).

W twoim przykładzie poprawne byłyby następujące wywołania funkcji:

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

Zobacz więcej tutaj: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

FrustratedWithFormsDesigner
źródło
16
Zauważ, że argumenty mogą być również przekazywane jako tablica JID (to sprawia, że ​​varargs jest kompatybilny wstecz).
mjn
54
Zauważ też, że przekazanie 0 varargs (nic) jest legalne.
Hawkeye Parker
9
Na koniec vararg musi być ostatnim parametrem metody. Tak więc nie możesz mieć dwóch parametrów vararg w tej samej metodzie. Może znajdziesz ten sposób interesujący docs.oracle.com/javase/7/docs/api/java/util/...
BlackBrain
62

Sposób użycia elipsy lub varargsa w metodzie jest taki, jakby to była tablica:

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

Metodę tę można wywołać w następujący sposób:

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

Wewnątrz PrintWithEllipsistyp setOfStringsjest tablicą ciągu znaków. Abyś mógł zapisać kompilatorowi trochę pracy i przekazać tablicę:

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

W przypadku metod varargs parametr sekwencji jest traktowany jako tablica tego samego typu. Więc jeśli dwa podpisy różnią się tylko tym, że jeden deklaruje sekwencję, a drugi tablicę, jak w tym przykładzie:

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

wtedy pojawia się błąd czasu kompilacji.

Źródło: specyfikacja języka programowania Java , w której termin techniczny jest variable arity parameterraczej terminem wspólnym varargs.

Lucio
źródło
22

Notacja z trzema kropkami (...) jest zapożyczona z matematyki i oznacza „... i tak dalej”.

Jeśli chodzi o użycie w Javie, oznacza to, co oznacza varargs, że do wywołania metody można dodać dowolną liczbę argumentów. Jedynymi ograniczeniami są to, że varargsmusi znajdować się na końcu podpisu metody i może być tylko jedna na metodę.

James Goodwin
źródło
5

varargsone używane do tworzenia metody, która odbiera dowolną liczbę argumentów.

Na przykład metoda PrintStream.printf używa go, ponieważ nie wiesz, ile argumentów użyjesz.

Można je wykorzystać tylko jako ostateczną pozycję argumentów.

varargszostał dodany do Java 1.5

OscarRyz
źródło
3

Oznacza to, że metoda akceptuje zmienną liczbę argumentów („varargs”) typu JID. W ramach metody recipientJidsprzedstawiono.

Jest to przydatne w przypadkach, gdy masz metodę, która może opcjonalnie obsłużyć więcej niż jeden argument w naturalny sposób, i pozwala na pisanie wywołań, które mogą przekazać jeden, dwa lub trzy parametry do tej samej metody, bez brzydoty tworzenia tablica w locie.

Umożliwia także idiomy, takie jak sprintfz C; patrz String.format()na przykład.

Obrabować
źródło