String [] args vs (String ... args)

9

Wenn ich für Android programmiere und eine AsyncTask verwende, sieht die doInBackground-Methode folgendermaßen aus.

 protected String doInBackground(String... args)

Wenn ich die Argumente jedoch irgendwo in diesem Block verwende, kann ich wie in einem normalen String-Array darauf zugreifen, beispielsweise in meinem Programm

        @Override
    protected String doInBackground(String... args)
    {
        String details = "";
        try
        {
            details = facade.getRecipeDetails(args[0]);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return details;
    }

Was gut funktioniert und ich habe kein Problem damit. Aber ich frage mich, warum sie (String ... args) anstelle eines normalen Arrays von Strings verwenden. Liegt es nur daran, dass Sie in der aufrufenden Methode einfach Folgendes schreiben können:

 new AsyncHandler.execute("argument1","argument2","argument3",...)  

anstatt ein neues Array zu erstellen, um die Argumente zu übergeben? Obwohl wir schreiben konnten

new AsyncHandler().execute(new String[]{"Argument1","Argument2"});

Das ist etwas ausführlicher.

Sind (String ...) und String [] gleichbedeutend mit ihrer Funktionsweise, aber die Übergabe von Argumenten ist mit ersteren einfacher, da kein Array erstellt werden muss? Soweit ich das beurteilen kann, wird Ersteres auch in ein String-Array im Hintergrund übersetzt. Würden beide also mit demselben Code kompilieren und es ist nur "syntaktischer Zucker"?

Dylan Meeus
quelle
(String ...)bedeutet, dass Sie so viele StringParameter hinzufügen können, wie Sie möchten. Dies String[]ist ein Parameter, bei dem es sich um ein Array von Zeichenfolgen handelt. (String ...)hängt vom ersten Parameter ab AsyncTask, es ist nicht immer String.
FaizanRabbani
@FaizanRabbani außer dass Sie auch einen anrufen können, String...als ob esString[]
Ratschenfreak
@ratchetfreak Ja, es kann als String[], aber nehmen wir an, es war standardmäßig String[]. Es wäre ein ziemliches Problem gewesen, verschiedene StringParameter in einem Array zu verwenden. Stattdessen gaben sie eine Flexibilität zu verwenden (String ...).
FaizanRabbani
@FaizanRabbani Mir ist bewusst, dass es nicht immer String ist, es ist nur ein Beispiel =). Gleiches gilt für Boolean ... oder andere Dinge, aber ich habe String gern verwendet, weil wir die wichtigsten (String [] args) kennen. Und Sie sagten: "Sie können so viele Zeichenfolgen übergeben, wie Sie möchten". Nun, Sie können einige Zeichenfolgen mit einem Array übergeben. Mir scheint immer noch, dass Sie mit Arrays dasselbe erreichen können, obwohl es weniger lesbar und lästiger ist. (Das Übergeben eines Arrays von Arrays würde beispielsweise die Lesbarkeit etwas beeinträchtigen.) Ist es richtig, dass es dann hauptsächlich der Lesbarkeit dient? (Danke übrigens schon)
Dylan Meeus
@FaizanRabbani Nun, es ist ein einfacher Wrap von new String[]{...}zu konvertieren (es ist, was tatsächlich passiert, wenn Sie eine verwenden String...)
Ratschenfreak

Antworten:

15

(String ...)ist eine Reihe von Parametern des Typs String, wo , wie String[]ist ein einzelner Parameter .

Jetzt String[]kann hier derselbe Zweck vollständig erfüllt werden, (String ...)bietet jedoch mehr Lesbarkeit und Benutzerfreundlichkeit.

Es bietet auch eine Option, mit der wir mehrere Arrays Stringanstelle eines einzigen übergeben können String[].

FaizanRabbani
quelle
1
Während String[]eine Methode String...als Parameter übergeben werden kann, können zwei String[]s nicht. Hier findet keine implizite Array-Verkettung statt.
5

Eine Funktion von String [] vs String ... ist, dass der "String ..." nicht Teil des Aufrufs sein muss.

public void test(String... args){ 
   if(args.length > 0){
      for( String text : args){
         System.out.println(text);
      }
   }else{
      System.out.println("No args defined.");
   }
}

public void callerTest(){
     test();
     System.out.println();

     test("tree");
     System.out.println();

     test("dog", "cat", "pigeon");
}

Wenn Sie dann callerTest();die Ausgabe aufrufen, wird:

No args defined.

tree

dog
cat
pigeon
GetBackerZ
quelle