Frage

Beachten Sie die folgenden Methodensignaturen:

public fooMethod (Foo[] foos) { /*...*/ }

und

public fooMethod (Foo... foos) { /*...*/ }

Erläuterung: Die ehemalige nimmt ein Array von Foo-Objekten als Argument - fooMethod(new Foo[]{..}) - während die letzteren eine beliebige Anzahl von Argumenten vom Typ Foo nehmen, und stellt sie als ein Array von Foo: s innerhalb des Verfahrens - fooMethod(fooObject1, fooObject2, etc...).

Java wirft einen Anfall, wenn beide definiert sind, behaupten, dass sie doppelte Methoden sind. Ich habe einige Detektivarbeit, und fand heraus, dass die erste Erklärung wirklich eine explizite Array von Foo Objekte erfordert, und das ist der einzige Weg, diese Methode aufzurufen. Der zweite Weg nimmt tatsächlich sowohl eine beliebige Menge von Foo Argumenten und übernimmt auch eine Reihe von Foo-Objekten.

Also, die Frage ist, da diese Verfahren flexibler scheint, gibt es Gründe, die das erste Beispiel zu verwenden, oder habe ich verpasst etwas vital?

War es hilfreich?

Lösung

Diese Methoden sind eigentlich die gleiche.

Diese Funktion wird varargs genannt, und es ist eine Compiler-Funktion. Hinter den Kulissen ist übersetzt zu der erstgenannten Version.

Es gibt eine Gefahr, wenn Sie eine Methode definieren, Objekt akzeptiert ... und Sie schickte einen Parameter vom Typ Object []!

Andere Tipps

Ich mag Shimi Erklärung hinzufügen, um hinzuzufügen, dass ein weitere Einschränkung der varargs Syntax ist, dass der Vararg die letzten erklärten Parameter sein muss. So kann man das nicht tun:

void myMethod(String... values, int num);

Das bedeutet, dass eine bestimmte Methode nur einen einzigen Vararg Parameter haben kann. In Fällen, in denen Sie mehrere Arrays zu übergeben wollen, können Sie für nur eine von ihnen verwenden varargs.

In der Praxis ist varargs am besten, wenn Sie die args als eine beliebige Anzahl unterschiedlicher Werte behandeln, anstatt als ein Array. Java5 ordnet sie einen Array einfach, denn das war die bequemste Sache zu tun.

Ein gutes Beispiel ist String.format (). Hier werden die varargs abgestimmt gegen die Format-Platzhalter im ersten Argument.

Dieses wurde in Java 5 und vorhandene Bibliotheken eingeführt werden überarbeitet allmählich wird es zu unterstützen. Vielleicht haben Sie noch die ehemalige verwenden zu betonen, dass das Verfahren 2+ Eingänge erfordert, dazu gibt es Beschränkungen, wo die ... verwendet werden.

Es gibt sicherlich keine Performance-Probleme oder Dinge so zu betrachten, so kommt es auf Semantik.

Erwarten Sie den Anrufer Ihrer Methode ein Array von Foo haben, bereit zur Hand? Dann nutzen Sie die Foo [] Version. Verwenden Sie die varargs Variante die Möglichkeit, mit einem „Bündel“ von Foo anstelle eines Arrays zu betonen.

Ein klassisches Beispiel für varargs ISt das String-Format (in C #, weiß nicht, wie seine in Java genannt):

string Format(string formatString, object... args)

Hier erwarten Sie die args von verschiedenen Typen sein, also Argumente eine Reihe von mit wäre sehr ungewöhnlich, daher die varargs Variante.

Auf der anderen Seite in so etwas wie

string Join(string[] substrings, char concatenationCharacter)

ein Array verwendet, ist durchaus sinnvoll.

Beachten Sie auch, dass Sie mehrere Array-Parameter und nur ein Vararg Parameter am Ende der Paramater-Liste haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top