Was bedeuten die 3 Punkte in der folgenden Methode?
public void myMethod(String... strings){
// method body
}
quelle
Was bedeuten die 3 Punkte in der folgenden Methode?
public void myMethod(String... strings){
// method body
}
Dies bedeutet, dass null oder mehr String-Objekte (oder ein Array davon) als Argument (e) für diese Methode übergeben werden können.
Siehe den Abschnitt "Beliebige Anzahl von Argumenten" hier: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
In Ihrem Beispiel können Sie es wie folgt nennen:
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});
Wichtiger Hinweis: Die auf diese Weise übergebenen Argumente sind immer ein Array - auch wenn es nur eines gibt. Stellen Sie sicher, dass Sie es im Methodenkörper so behandeln.
Wichtiger Hinweis 2: Das Argument, das das erhält, ...
muss das letzte in der Methodensignatur sein. Also, myMethod(int i, String... strings)
ist okay, aber myMethod(String... strings, int i)
nicht okay.
Vielen Dank an Vash für die Klarstellungen in seinem Kommentar.
someMethod(new SomeType[] { })
. Das wäre ein Hack, nicht wahr?Diese Funktion heißt varargs und wurde in Java 5 eingeführt . Dies bedeutet, dass die Funktion mehrere
String
Argumente empfangen kann :Dann können Sie die
String
Variable als Array verwenden:Diese Antwort lehnt sich stark an Kiswas und Lorenzos an ... und auch an den Kommentar des Graphain.
quelle
Es ist Varargs :)
Die Abkürzung varargs für Argumente variabler Länge ist eine Funktion, mit der die Methode eine variable Anzahl von Argumenten (null oder mehr) akzeptieren kann. Mit varargs ist es einfach geworden, Methoden zu erstellen, die eine variable Anzahl von Argumenten annehmen müssen. Die Funktion des Variablenarguments wurde in Java 5 hinzugefügt.
Syntax von varargs
Ein Vararg wird durch drei Auslassungspunkte (drei Punkte) nach dem Datentyp getrennt, seine allgemeine Form ist
Notwendigkeit für Varargs
Vor Java 5 gab es zwei Möglichkeiten, damit umzugehen, falls eine variable Anzahl von Argumenten erforderlich war
Wenn die maximale Anzahl von Argumenten, die eine Methode annehmen kann, klein und bekannt war, können überladene Versionen der Methode erstellt werden. Wenn die maximale Anzahl von Argumenten, die eine Methode annehmen konnte, groß oder / und unbekannt war, bestand der Ansatz darin, diese Argumente in ein Array einzufügen und sie an eine Methode zu übergeben, die Array als Parameter verwendet. Diese beiden Ansätze waren fehleranfällig - sie erstellten jedes Mal ein Array von Parametern und waren schwer zu pflegen -, da das Hinzufügen eines neuen Arguments zum Schreiben einer neuen überladenen Methode führen kann.
Vorteile von Varargs
Bietet eine viel einfachere Option. Weniger Code, da keine überladenen Methoden geschrieben werden müssen.
Beispiel für Varargs
Aus dem Programm ist ersichtlich, dass hier die Länge verwendet wird, um die Anzahl der an die Methode übergebenen Argumente zu ermitteln. Dies ist möglich, weil Varargs implizit als Array übergeben werden. Alle Argumente, die als varargs übergeben werden, werden in einem Array gespeichert, das mit dem Namen varargs bezeichnet wird. In diesem Programm enthält der Array-Name Werte. Beachten Sie auch, dass die Methode mit einer anderen Anzahl von Argumenten aufgerufen wird. Rufen Sie zuerst vier Argumente, dann drei Argumente und dann null Argumente auf. Alle diese Aufrufe werden mit derselben Methode behandelt, die varargs verwendet.
Einschränkung mit Varargs
Es ist möglich, andere Parameter mit dem Parameter varargs in einer Methode zu haben. In diesem Fall muss der Parameter varargs jedoch der letzte von der Methode deklarierte Parameter sein.
Eine weitere Einschränkung bei varargs besteht darin, dass nur ein varargs-Parameter vorhanden sein darf.
Überladen von varargs Methoden
Es ist möglich, eine Methode zu überladen, die den Parameter varargs verwendet. Die Varargs-Methode kann überladen werden durch -
Die Typen des vararg-Parameters können unterschiedlich sein. Durch Hinzufügen anderer Parameter. Beispiel für das Überladen der Varargs-Methode
Varargs und überladende Mehrdeutigkeit
In einigen Fällen kann der Aufruf mehrdeutig sein, während wir die varargs-Methode überladen haben. Sehen wir uns ein Beispiel an
Wenn wir in diesem Programm die Methode displayData () ohne Parameter aufrufen, wird ein Fehler ausgegeben, da der Compiler nicht sicher ist, ob dieser Methodenaufruf für
displayData(String ... values)
oder istdisplayData(int ... values)
Genauso wie wir überladene Methoden haben, bei denen eine die
vararg
Methode eines Typs und eine andere Methode einen Parameter und einenvararg
Parameter desselben Typs hat, dann haben wir auch die Mehrdeutigkeit - As Exp -displayData(int ... values)
unddisplayData(int a, int ... values)
Diese beiden überladenen Methoden sind immer mehrdeutig.
quelle
Dies ist die Java-Methode zum Übergeben von Varargs (Argumenten mit variabler Anzahl).
Wenn Sie mit C vertraut sind, ähnelt dies der verwendeten
...
Syntax derprintf
Funktion:aber auf typsichere Weise: Jedes Argument muss dem angegebenen Typ entsprechen (in Ihrem Beispiel sollten es alle sein
String
).Dies ist ein einfaches Beispiel dafür, wie Sie varargs verwenden können :
Das
...
Argument ist eigentlich ein Array, daher können Sie aString[]
als Parameter übergeben.quelle
Es ist wohl ein Beispiel für syntaktischen Zucker, da es sowieso als Array implementiert ist (was nicht bedeutet, dass es nutzlos ist). Ich bevorzuge es, ein Array zu übergeben, um es klar zu halten, und Methoden mit Arrays eines bestimmten Typs zu deklarieren. Eher eine Meinung als eine Antwort.
quelle
Um etwas Licht ins Dunkel zu bringen, ist es wichtig zu wissen, dass die var-arg-Parameter auf einen beschränkt sind und Sie nicht mehrere var-art-Parameter haben können. Zum Beispiel ist dies illigal:
quelle
Betrachten Sie es einfach als das Schlüsselwort
params
in C #, wenn Sie aus diesem Hintergrund kommen :)quelle
Ein wirklich häufiger Weg, um ein klares Beispiel für die Verwendung der drei Punkte zu sehen, ist in einer der bekanntesten Methoden in Android AsyncTask vorhanden (die heute aufgrund von RXJAVA nicht allzu häufig verwendet wird, ganz zu schweigen von den Google Architecture-Komponenten). Sie können Tausende von Beispielen finden, die nach diesem Begriff suchen, und der beste Weg, die Bedeutung der drei Punkte zu verstehen und nie mehr zu vergessen, besteht darin, dass sie einen ... Zweifel ... ausdrücken, genau wie in der gemeinsamen Sprache. Es ist nämlich nicht klar, wie viele Parameter übergeben werden müssen, könnte 0 sein, könnte 1 sein, könnte mehr sein (ein Array) ...
quelle
String...
ist das gleiche wieString[]
quelle
String...
es dasselbe ist wieString[]
, kannst du das nicht einfach sagen?String[]
ein Argument erforderlich ist (mindestens ein leeres Array), währendString...
dies nicht der Fall ist (siehe Antwort oben).Neben den anderen gut geschriebenen Antworten ist ein Vorteil, den
varagrs
ich als nützlich empfunden habe, dass das Aufrufen einer Methode mit Array als Parametertyp den Aufwand beim Erstellen eines Arrays verringert. Elemente hinzufügen und dann senden. Stattdessen kann ich die Methode einfach mit so vielen Werten aufrufen, wie ich möchte. von null bis viele.quelle
Beispiel 1:
Beispiel 2:
quelle
Syntax: (Triple dot ...) -> Bedeutet, dass wir null oder mehr Objekte hinzufügen können, die in Argumenten übergeben werden, oder ein Array vom Typ Objekt übergeben können.
Definition: 1) Das Object ... -Argument ist nur eine Referenz auf ein Array von Objekten.
2) ('String []' oder String ...) Es kann eine beliebige Anzahl von String-Objekten verarbeiten. Intern wird ein Array von Referenztypobjekten verwendet.
3) Wenn Sie die Methode mit einem einzelnen Argument aufrufen möchten und es sich zufällig um ein Array handelt, müssen Sie es explizit einschließen
Anwendung: Wird hauptsächlich verwendet, wenn die Anzahl der Argumente dynamisch ist (Anzahl der zur Laufzeit bekannten Argumente) und überschrieben wird. Allgemeine Regel - In der Methode können beliebige Typen und beliebig viele Argumente übergeben werden. Wir können keine Objektargumente (...) vor bestimmten Argumenten hinzufügen. dh
quelle