Wofür steht die Ellipse (…) in dieser Methodensignatur?


203

Wofür steht in den App Engine-Dokumenten das Auslassungszeichen ( JID...) in dieser Methodensignatur?

public MessageBuilder withRecipientJids(JID... recipientJids)

Was ist die Funktion dieser drei Punkte?


7
Übrigens habe ich das HORIZONTAL ELLIPSIS-Zeichen Unicode U + 2026 ausprobiert . NetBeans 8 in Java 8 meldet "unzulässiges Zeichen". Java-Varargs erfordern also den dreifachen FULL STOP (Punkt) ....
Basil Bourque

Antworten:


208

Das sind Java-Varargs. Mit ihnen können Sie eine beliebige Anzahl von Objekten eines bestimmten Typs übergeben (in diesem Fall sind sie vom Typ JID).

In Ihrem Beispiel wären die folgenden Funktionsaufrufe gültig:

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

Weitere Informationen finden Sie hier: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html


16
Beachten Sie, dass die Argumente auch als Array von JID übergeben werden können (dies macht varargs abwärtskompatibel).
mjn

54
Beachten Sie auch, dass das Übergeben von 0 varargs (nichts) legal ist.
Hawkeye Parker

9
Last but not least muss der Vararg der letzte Parameter der Methode sein. Sie können also nicht zwei vararg-Parameter in derselben Methode haben. Vielleicht finden Sie diese Methode interessant docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain

62

Die Art und Weise , die zu verwenden Ellipsen oder varargs innerhalb der Methode ist , als ob es ein Array war:

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

Diese Methode kann wie folgt aufgerufen werden:

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

Im Inneren PrintWithEllipsisist der Typ von setOfStringsein Array von String. Sie können dem Compiler also etwas Arbeit ersparen und ein Array übergeben:

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

Bei varargs- Methoden wird ein Sequenzparameter als Array desselben Typs behandelt. Wenn sich also zwei Signaturen nur darin unterscheiden, dass eine eine Sequenz und die andere ein Array deklariert, wie in diesem Beispiel:

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

dann tritt ein Kompilierungsfehler auf.

Quelle: Die Java Programming Language- Spezifikation, bei der der Fachbegriff variable arity parametereher der allgemeine Begriff ist varargs.


22

Die Drei-Punkt-Notation (...) stammt tatsächlich aus der Mathematik und bedeutet "... und so weiter".

Die Verwendung in Java steht für varargs, was bedeutet, dass dem Methodenaufruf eine beliebige Anzahl von Argumenten hinzugefügt werden kann. Die einzigen Einschränkungen bestehen darin, dass das varargsam Ende der Methodensignatur stehen muss und es nur eine pro Methode geben kann.


5

Diese werden varargsverwendet, um eine Methode zu erstellen, die eine beliebige Anzahl von Argumenten empfängt.

Zum Beispiel wird es von der PrintStream.printf- Methode verwendet, da Sie nicht wissen, wie viele Argumente Sie verwenden würden.

Sie können nur als endgültige Position der Argumente verwendet werden.

varargswurde auf Java 1.5 hinzugefügt


3

Dies bedeutet, dass die Methode eine variable Anzahl von Argumenten ("varargs") vom Typ akzeptiert JID. Innerhalb der MethoderecipientJids wird vorgestellt.

Dies ist praktisch für Fälle, in denen Sie eine Methode haben, die optional mehr als ein Argument auf natürliche Weise verarbeiten kann, und die es Ihnen ermöglicht, Aufrufe zu schreiben, die einen, zwei oder drei Parameter an dieselbe Methode übergeben können, ohne die Hässlichkeit des Erstellens zu haben ein Array im laufenden Betrieb.

Es ermöglicht auch Redewendungen wie sprintfvon C; siehe String.format()zum Beispiel.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.