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

9

Lors de la programmation pour Android, chaque fois que j'utilise un AsyncTask, la méthode doInBackground ressemble à ceci.

 protected String doInBackground(String... args)

Mais lorsque j'utilise les arguments n'importe où dans ce bloc, je peux y accéder comme un tableau String normal par exemple dans mon programme

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

Ce qui fonctionne bien et je n'ai aucun problème à y faire face. Mais je me demande pourquoi ils utilisent (String ... Args) au lieu d'un tableau normal de Strings. Est-ce simplement parce que dans la méthode d'appel, vous pouvez simplement écrire quelque chose comme:

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

au lieu de créer un nouveau tableau pour passer les arguments? Bien qu'on puisse écrire

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

qui est un peu plus verbeux.

Est-ce que (String ...) et String [] sont synonymes dans la façon dont ils fonctionnent, mais le passage d'arguments est simplement plus facile à utiliser avec le premier car il n'est pas nécessaire de créer un tableau? Autant que je sache, la première est également traduite en un tableau de chaînes en arrière-plan, alors est-ce qu'ils compileraient tous les deux dans le même code et c'est juste du «sucre syntaxique»?

Dylan Meeus
la source
(String ...)signifie que vous pouvez ajouter autant de paramètres Stringque vous le souhaitez, String[]est un paramètre qui est un tableau de chaînes. (String ...)dépend du premier paramètre de AsyncTask, ce n'est pas toujours String.
FaizanRabbani
@FaizanRabbani, sauf que vous pouvez également appeler un String...comme si c'étaitString[]
ratchet freak
@ratchetfreak Oui, il peut agir comme un String[], mais supposons qu'il l'était par défaut String[]. Il aurait été assez difficile d'utiliser différents Stringparamètres dans un tableau. Au lieu de cela, ils ont donné une flexibilité d'utilisation (String ...).
FaizanRabbani
@FaizanRabbani Je suis conscient que ce n'est pas toujours String, c'est juste un exemple =). Il en va de même pour Boolean ... ou d'autres choses, mais j'ai aimé utiliser String en raison des arguments principaux (String []) que nous connaissons. Et vous avez dit 'vous pouvez passer autant de chaînes que vous le souhaitez', et bien vous pouvez passer pas mal de chaînes avec un tableau. Pour moi, il semble toujours que vous pouvez obtenir la même chose avec les tableaux, bien que ce soit moins lisible et plus compliqué. (Passer un tableau de tableaux par exemple, réduirait un peu la lisibilité). Est-il exact que c'est principalement pour la lisibilité alors? (merci déjà btw)
Dylan Meeus
@FaizanRabbani eh bien, c'est un simple emballage de new String[]{...}conversion (c'est ce qui se passe réellement lorsque vous utilisez un String...)
ratchet freak

Réponses:

15

(String ...)est un tableau de paramètres de type String, où as String[]est un paramètre unique .

Maintenant, ici, vous String[]pouvez remplir le même objectif ici, mais cela (String ...)offre plus de lisibilité et de facilité d'utilisation.

Il fournit également une option que nous pouvons transmettre plusieurs tableaux au Stringlieu d'un seul à l'aide String[].

FaizanRabbani
la source
1
Alors que String[]peut être passé dans une méthode prenant String...comme paramètre, deux String[]s ne le peuvent pas. Il n'y a aucune concaténation de tableau implicite qui a lieu ici.
5

Une caractéristique de String [] vs String ... est que le "String ..." n'a pas besoin de faire partie de l'appel.

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

Ensuite, si vous appelez callerTest();la sortie sera:

No args defined.

tree

dog
cat
pigeon
GetBackerZ
la source