1044 Stimmen

Was bedeuten die 3 Punkte neben einem Parametertyp in Java?

Was bedeuten die folgenden 3 Punkte String in der folgenden Methode bedeuten?

public void myMethod(String... strings){
    // method body
}

1247voto

kiswa Punkte 13937

Es bedeutet, dass null oder mehr String-Objekte (oder ein einzelnes 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önnten Sie es als eine der folgenden Möglichkeiten aufrufen:

myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});

Wichtiger Hinweis: Das/die auf diese Weise übergebene(n) Argument(e) ist/sind immer ein Array - auch wenn es nur eines ist. Stellen Sie sicher, dass Sie es im Methodenrumpf auch so behandeln.

Wichtige Anmerkung 2: Das Argument, das die ... muss die letzte in der Methodensignatur sein. Also, myMethod(int i, String... strings) ist in Ordnung, aber myMethod(String... strings, int i) ist nicht in Ordnung.

Vielen Dank an Vash für die Klarstellungen in seinem Kommentar.

174voto

Cristian Punkte 195886

Dieses Merkmal wird als varargs und es ist eine Funktion, die in Java 5 eingeführt wurde. Es bedeutet, dass eine Funktion mehrere String Argumente:

myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array

Dann können Sie die String var als Array:

public void myMethod(String... strings) {
    for (String whatever : strings) {
        // do what ever you want
    }

    // the code above is equivalent to
    for (int i = 0; i < strings.length; i++) {
        // classical for. In this case you use strings[i]
    }
}

Diese Antwort lehnt sich stark an die von kiswa und Lorenzo an... und auch an den Kommentar von Graphain.

33voto

shanwije Punkte 561

Es ist Varargs :)

Das varargs-Kürzel für Argumente variabler Länge ist eine Funktion, die es der Methode erlaubt, eine variable Anzahl von Argumenten (null oder mehr) zu akzeptieren. Mit varargs ist es einfach geworden, Methoden zu erstellen, die eine variable Anzahl von Argumenten annehmen müssen. Die Funktion der variablen Argumente wurde in Java 5 hinzugefügt.

Syntax von varargs

Ein vararg wird durch drei Ellipsen (drei Punkte) nach dem Datentyp abgegrenzt, seine allgemeine Form ist

return_type method_name(data_type ... variableName){
}  

Bedarf an varargs

Vor Java 5 gab es für den Fall, dass eine variable Anzahl von Argumenten benötigt wurde, zwei Möglichkeiten, diese zu behandeln

Wenn die maximale Anzahl von Argumenten, die eine Methode annehmen kann, klein und bekannt war, dann konnten überladene Versionen der Methode erstellt werden. Wenn die maximale Anzahl von Argumenten, die eine Methode aufnehmen kann, groß oder/und unbekannt war, dann war der Ansatz, diese Argumente in ein Array zu packen und sie an eine Methode zu übergeben, die das Array als Parameter nimmt. Diese beiden Ansätze waren fehleranfällig - jedes Mal wurde ein Array mit Parametern erstellt - und schwer zu pflegen, da das Hinzufügen eines neuen Arguments zum Schreiben einer neuen überladenen Methode führen konnte.

Vorteile von varargs

Bietet eine viel einfachere Option. Weniger Code, da keine überladenen Methoden geschrieben werden müssen.

Beispiel für varargs

public class VarargsExample {
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 public static void main(String[] args) {
  VarargsExample vObj = new VarargsExample();
  // four args
  vObj.displayData("var", "args", "are", "passed");
  //three args
  vObj.displayData("Three", "args", "passed");
  // no-arg
  vObj.displayData();
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 
Number of arguments passed 3
Three 
args 
passed 
Number of arguments passed 0

Aus dem Programm ist ersichtlich, dass length hier 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 durch den Namen, der varargs gegeben wird, bezeichnet wird. In diesem Programm ist der Name des Arrays values. Beachten Sie auch, dass die Methode mit einer unterschiedlichen Anzahl von Argumenten aufgerufen wird, zuerst mit vier Argumenten, dann mit drei Argumenten und dann mit null Argumenten. Alle diese Aufrufe werden von der gleichen Methode verarbeitet, die varargs entgegennimmt.

Einschränkung mit varargs

Es ist möglich, andere Parameter mit varargs-Parameter in einer Methode zu haben, aber in diesem Fall muss varargs-Parameter der letzte von der Methode deklarierte Parameter sein.

void displayValues(int a, int b, int … values) // OK
   void displayValues(int a, int b, int … values, int c) // compiler error

Eine weitere Einschränkung bei varargs ist, dass es nur einen varargs-Parameter geben darf.

void displayValues(int a, int b, int … values, int … moreValues) // Compiler error

Überladen von varargs-Methoden

Es ist möglich, eine Methode zu überladen, die varargs-Parameter annimmt. Die Varargs-Methode kann überladen werden durch -

Die Typen der vararg-Parameter können unterschiedlich sein. Durch Hinzufügen weiterer Parameter. Beispiel für das Überladen der varargs-Methode

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 // Method which has int vararg parameter
 public void displayData(int ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 // Method with int vararg and one more string parameter
 public void displayData(String a, int ... values){
  System.out.println(" a " + a);
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 public static void main(String[] args) {
  OverloadingVarargsExp vObj = new OverloadingVarargsExp();
  // four string args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // One String param and two int args
  vObj.displayData("Test", 20, 30);
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 

Number of arguments passed 2
10 
20

 a Test
Number of arguments passed 2
20 
30 

Varargs und Überladungsmehrdeutigkeit

In einigen Fällen kann der Aufruf zweideutig sein, während wir die varargs-Methode überladen haben. Hier ein Beispiel

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 // Method which has int vararg parameter
 public void displayData(int ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 public static void main(String[] args) {
  OverloadingVarargsExp vObj = new OverloadingVarargsExp();
  // four string args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // This call is ambiguous
  vObj.displayData();
 }
}

Wenn wir in diesem Programm die Methode displayData() ohne Parameter aufrufen, wird ein Fehler ausgelöst, da der Compiler nicht sicher ist, ob dieser Methodenaufruf für displayData(String ... values) o displayData(int ... values)

Das Gleiche gilt, wenn wir überladene Methoden haben, von denen eine die vararg Methode eines Typs und eine andere Methode hat einen Parameter und vararg Parameter des gleichen Typs, dann haben wir auch die Zweideutigkeit - Als Exp - displayData(int ... values) y displayData(int a, int ... values)

Diese beiden überladenen Methoden werden immer zweideutig sein.

18voto

lornova Punkte 6177

Dies ist der Java-Weg zur Übergabe varargs (variable Anzahl von Argumenten).

Wenn Sie mit C vertraut sind, ist dies ähnlich wie die ... Syntax verwendet es die printf Funktion:

int printf(const char * format, ...);

aber auf eine typsichere Weise: jedes Argument muss dem angegebenen Typ entsprechen (in Ihrem Beispiel sollten sie alle String ).

Dies ist ein einfaches Beispiel dafür, wie Sie Folgendes verwenden können varargs :

class VarargSample {

   public static void PrintMultipleStrings(String... strings) {
      for( String s : strings ) {
          System.out.println(s);
      }
   }

   public static void main(String[] args) {
      PrintMultipleStrings("Hello", "world");
   }
}

En ... Argument ist eigentlich ein Array, Sie könnten also eine String[] als Parameter.

16voto

MichaelS Punkte 251

Es ist wohl ein Beispiel für syntaktischen Zucker, da es ohnehin als Array implementiert ist (was nicht bedeutet, dass es nutzlos ist) - ich bevorzuge die Übergabe eines Arrays, um es übersichtlich zu halten, und deklariere auch Methoden mit Arrays eines bestimmten Typs. Das ist allerdings eher eine Meinung als eine Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X