String [] args vs (String.. Args)

9

Podczas programowania dla Androida za każdym razem, gdy używam AsyncTask, metoda doInBackground wygląda następująco.

 protected String doInBackground(String... args)

Ale gdy używam argumentów w dowolnym miejscu tego bloku, mogę uzyskać do nich dostęp jak normalną tablicę String, na przykład w moim programie

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

Które działa dobrze i nie mam problemu z tym. Ale zastanawiam się, dlaczego używają (String.… Args) zamiast zwykłej tablicy ciągów. Czy tylko dlatego, że w metodzie wywoływania możesz po prostu napisać coś takiego:

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

zamiast tworzyć nową tablicę do przekazywania argumentów? Chociaż moglibyśmy pisać

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

co jest nieco bardziej szczegółowe.

Czy (String ...) i String [] są synonimami w tym, jak działają, ale przekazywanie argumentów jest po prostu łatwiejsze przy użyciu tego pierwszego, ponieważ nie ma potrzeby tworzenia tablicy? O ile mogę stwierdzić, pierwsza z nich jest również tłumaczona na tablicę łańcuchów w tle, więc czy obie kompilowałyby się do tego samego kodu, a to po prostu „cukier składniowy”?

Dylan Meeus
źródło
(String ...)oznacza, że ​​możesz dodać tyle Stringparametrów, ile chcesz, String[]to jeden parametr, który jest tablicą ciągów. (String ...)zależy od pierwszego parametru AsyncTask, nie zawsze jest String.
FaizanRabbani
@FaizanRabbani z wyjątkiem tego, że możesz także zadzwonić String...tak, jakby to byłString[]
maniak ratchet
@ratchetfreak Tak, może działać jako String[], ale załóżmy, że było domyślnie String[]. Użycie innego Stringparametru w tablicy byłoby dużym problemem . Zamiast tego dali elastyczność użytkowania (String ...).
FaizanRabbani
@FaizanRabbani Wiem, że nie zawsze jest to String, to tylko przykład =). To samo dotyczy Boolean ... lub innych rzeczy, ale lubiłem używać String ze względu na główne (Argumenty String []), które znamy. Powiedziałeś: „możesz przekazać tyle łańcuchów, ile chcesz”, możesz przekazać kilka łańcuchów z tablicą. Dla mnie nadal wydaje się, że możesz osiągnąć to samo za pomocą tablic, chociaż jest to mniej czytelne i bardziej kłopotliwe. (Na przykład przekazanie tablicy tablic nieco zmniejszy czytelność). Czy to prawda, że ​​chodzi głównie o czytelność? (dzięki już btw)
Dylan Meeus
@FaizanRabbani cóż, jest to zwykłe opakowanie new String[]{...}do konwersji (tak naprawdę dzieje się, gdy używasz a String...)
maniak ratchet

Odpowiedzi:

15

(String ...)to szereg parametrów, typu String, w którym w String[]jest jeden parametr .

Teraz tutaj String[]można wypełnić ten sam cel tutaj, ale (String ...)zapewnia większą czytelność i łatwość użytkowania.

Zapewnia również opcję, za pomocą której możemy przekazać wiele tablic Stringzamiast jednej String[].

FaizanRabbani
źródło
1
Chociaż String[]można przekazać do metody przyjmującej String...jako parametr, dwa String[]s nie mogą. Nie ma tu żadnej niejawnej konkatenacji macierzy.
5

Cechą String [] vs String ... jest to, że „String ...” nie musi być częścią wywołania.

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

Wtedy jeśli zadzwonisz callerTest();Wyjście będzie:

No args defined.

tree

dog
cat
pigeon
GetBackerZ
źródło