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

9

Cuando programo para Android, cada vez que uso una AsyncTask, el método doInBackground se ve así.

 protected String doInBackground(String... args)

Pero cuando uso los argumentos en cualquier parte de ese bloque, puedo acceder a ellos como una matriz de cadenas normal, por ejemplo, en mi programa

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

Lo que funciona bien y no tengo problemas para lidiar con eso. Pero me pregunto por qué usan (String... Args) en lugar de una matriz normal de Strings. ¿Es solo porque en el método de llamada puedes escribir algo como:

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

en lugar de crear una nueva matriz para pasar los argumentos? Aunque podriamos escribir

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

lo cual es un poco más detallado.

¿Son (String ...) y String [] sinónimos de cómo funcionan, pero el argumento que pasa es más fácil usando el primero porque no hay necesidad de crear una matriz? Por lo que puedo decir, el primero también se traduce a una matriz de cadenas en el fondo, ¿entonces ambos se compilarían en el mismo código y es solo 'azúcar sintáctico'?

Dylan Meeus
fuente
(String ...)significa que puede agregar tantos parámetros Stringcomo desee, String[]es un parámetro que es una matriz de cadenas. (String ...)depende del primer parámetro de AsyncTask, no siempre es así String.
FaizanRabbani
@FaizanRabbani excepto que también se puede llamar a una String...como si fueraString[]
monstruo de trinquete
@ratchetfreak Sí, puede actuar como un String[], pero supongamos que fue por defecto String[]. Hubiera sido un gran problema utilizar diferentes Stringparámetros en una matriz. En cambio, dieron una flexibilidad de uso (String ...).
FaizanRabbani
@FaizanRabbani Soy consciente de que no siempre es String, es solo un ejemplo =). Lo mismo ocurre con Boolean ... u otras cosas, pero me gustaba usar String debido a los principales (String [] args) con los que estamos familiarizados. Y dijiste 'puedes pasar tantas cadenas como quieras', bueno, puedes pasar bastantes cadenas con una matriz. Para mí, todavía parece que puede lograr lo mismo con las matrices, aunque es menos legible y más molesto. (Pasar una matriz de matrices, por ejemplo, reduciría un poco la legibilidad). ¿Es correcto que sea principalmente por legibilidad entonces? (gracias por cierto)
Dylan Meeus
@FaizanRabbani así que es una envoltura simple new String[]{...}para convertir (que es lo que realmente sucede cuando se utiliza una String...)
trinquete monstruo

Respuestas:

15

(String ...)es una matriz de parámetros de tipo String, donde como String[]es un solo parámetro .

Ahora aquí String[]puede completar el mismo propósito aquí, pero (String ...)proporciona más legibilidad y facilidad de uso.

También proporciona una opción por la que podemos pasar una matriz múltiple en Stringlugar de una sola usando String[].

FaizanRabbani
fuente
1
Si bien String[]puede pasarse a un método tomando String...como parámetro, dos String[]s no pueden. No hay concatenación de matriz implícita que tenga lugar aquí.
5

Una característica de String [] vs String ... es que el "String ..." no necesita ser parte de la llamada.

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

Entonces, si llamas a callerTest();la salida será:

No args defined.

tree

dog
cat
pigeon
GetBackerZ
fuente