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

9

Ao programar para android, sempre que eu uso uma AsyncTask, o método doInBackground se parece com isso.

 protected String doInBackground(String... args)

Mas ao usar os argumentos em qualquer lugar desse bloco, posso acessá-los como uma matriz String normal, por exemplo, no meu programa

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

O que funciona bem e não tenho problemas em lidar com isso. Mas estou me perguntando por que eles usam (String ... args) em vez de uma matriz normal de Strings. É apenas porque no método de chamada você pode escrever algo como:

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

em vez de criar uma nova matriz para passar os argumentos? Embora pudéssemos escrever

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

o que é um pouco mais detalhado.

(String ...) e String [] são sinônimos de como elas funcionam, mas a passagem de argumentos é mais fácil usando a primeira porque não há necessidade de criar uma matriz? Até onde eu sei, o primeiro também é traduzido para uma matriz de seqüências de caracteres em segundo plano, então ambos compilam o mesmo código e é apenas 'açúcar sintático'?

Dylan Meeus
fonte
(String ...)significa que você pode adicionar Stringquantos parâmetros desejar, String[]é um parâmetro que é uma matriz de strings. (String ...)depende do primeiro parâmetro de AsyncTask, nem sempre é String.
FaizanRabbani
@FaizanRabbani exceto que você também pode chamar um String...como se fosseString[]
aberração catraca
@ratchetfreak Sim, pode funcionar como um String[], mas vamos assumir que foi por padrão String[]. Teria sido um problema usar Stringparâmetros diferentes em uma matriz. Em vez disso, eles deram uma flexibilidade ao uso (String ...).
FaizanRabbani
@FaizanRabbani Estou ciente de que nem sempre é String, é apenas um exemplo =). O mesmo vale para booleano ... ou outras coisas, mas eu gostava de usar String devido ao main (String [] args) com o qual estamos familiarizados. E você disse 'você pode passar quantas strings quiser', bem, você pode passar algumas strings com uma matriz. Para mim, ainda parece que você pode conseguir o mesmo com matrizes, embora seja menos legível e mais trabalhoso. (Passar uma matriz de matrizes, por exemplo, reduziria um pouco a legibilidade). É correto que seja principalmente para facilitar a leitura? (obrigado já btw)
Dylan Meeus
@FaizanRabbani bem, é um quebra-cabeça simples de new String[]{...}converter (é o que realmente acontece quando você usa um String...) #
ratchet freak

Respostas:

15

(String ...)é uma matriz de parâmetros do tipo String, em que as String[]é um único parâmetro .

Agora, aqui, você String[]pode preencher o mesmo objetivo aqui, mas (String ...)fornece mais legibilidade e facilidade de uso.

Ele também fornece uma opção pela qual podemos passar várias matrizes, em Stringvez de uma única String[].

FaizanRabbani
fonte
11
Embora String[]possa ser passado para um método tomando String...como parâmetro, dois String[]s não podem. Não há concatenação implícita de matriz que ocorre aqui.
5

Um recurso de String [] vs String ... é que a "String ..." não precisa fazer parte da chamada.

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

Então, se você chamar callerTest();a Saída, será:

No args defined.

tree

dog
cat
pigeon
GetBackerZ
fonte