2011-10-31 17 views
8

estoy poniendo en práctica una API de tener un método que se pasa una lista de rutas en el que el programa lee los recursos de¿Cuándo preferir una lista varargs a una matriz?

public void importFrom(String... paths) { 

} 

que estoy usando varargs para hacer una llamada al método lo más conveniente posible para el usuario, como así

obj.importFrom("/foo", "/foo/bar); 

¿Este es un uso apropiado de varargs? ¿O está pasando en una matriz mejor?

+2

Aún puede pasar una matriz a un método varargs, se comportará de la misma manera. –

Respuesta

7

En su caso varargs está bien. Realmente no necesita hacer una matriz de las rutas que va a importar porque no hay nada que quiera hacer con estas rutas, aparte de pasarlas a su método importFrom.

La funcionalidad varargs le evita tener que crear explícitamente una matriz con el único propósito de pasar una colección de valores a un método único, que parece que tiene aquí.

Por cierto, que puede todavía pasar en una matriz si desea

public class VarargsDemo { 
    public static void f(String... args) { 
     for (String s: args) { 
      System.out.println(s); 
     } 
    } 
    public static void main(String[] args) { 
     String[] english = new String[]{"one", "two", "three"}; 
     f(english); 
     f("uno", "dos", "tres"); 
    } 
} 

Debido a que el comportamiento es el mismo, la diferencia se reduce a una pregunta (probablemente menor) de lo que quiere el método firma para "decir". Cuando declara un método para tomar un parámetro de matriz explícito, es casi como si quisiera enfatizar que desea operar en un objeto de matriz, algo que se ha definido fuera del método y tiene su propia existencia e importancia fuera del método, y uno en el que, tal vez, operaciones como la indexación importan. Al declarar el método con varargs, es como si estuvieras diciendo "solo dame un montón de elementos".

Por otra parte, esto no tiene por qué ser cierto; la JVM no conoce la diferencia, todo lo que ve es una matriz en tiempo de ejecución. Muchos programadores no se molestarán en dividir pelos sobre la intención de la firma del método. Varargs se trata de hacer las llamadas convenientes.

Dicho esto, el principal limitación de varargs es que dicho parámetro debe ser el último del método. En su caso, esto no es un problema, pero en general es algo a considerar.

+0

+1 para pasar la matriz - Todavía encuentro un poco confuso el párrafo sobre "objeto de matriz distincia": la única razón por la que veo para pasar una matriz real es para que la persona que llama pueda ver los cambios realizados por la llamada (invertir, clasificar) - pero la búsqueda no requeriría esto? –

+1

Sí, estaba mal escrito y tal vez no sea terriblemente importante. Lo reformulé un poco para tratar de hacerlo menos confuso y también mostrar que es un problema menor, si es realmente un problema. Gracias. –

2

La respuesta depende del uso previsto de su función. Si el usuario generalmente sabe en el momento de la codificación qué argumentos quiere pasar, varargs es el camino a seguir. Si el usuario necesita poder determinar el número de argumentos en el tiempo de ejecución, un argumento de matriz hará la vida mucho más fácil para él (o ella).

+0

Creo que está hablando de un conjunto abierto de parámetros. En los idiomas más antiguos, la única forma de determinar el final de los argumentos era usar un canario o formatear una cadena. No es así en Java. Para simplificar, usaría varargs ya que no es necesario hacer una lista temporal que haga que el código sea potencialmente más comprensible – Petesh

+0

"Si el usuario necesita poder determinar el número de argumentos en tiempo de ejecución", simplemente pasaría una matriz. –

1

Creo que la otra alternativa es usar List<String>. Personalmente, utilizaría un List si hay más de unos pocos argumentos o si los argumentos se procesan automáticamente desde algún lugar (analizado a partir de un archivo, por ejemplo).

Si va a escribir los argumentos manualmente en el código, entonces preferiría usar los varargs como usted propuso.

3

Dado que los argumentos varargs se compilan en un solo argumento de matriz, generalmente se pueden preferir varargs ya que esto podría ser más conveniente en algunos casos y aún así permitir pasar una matriz en otros casos.

public void importFrom(String... paths) 
{ 
} 

compila en

public void importFrom(String[] paths) 
{ 
} 

Como alternativa también se puede utilizar Iterable<String> para que sea más fácil pasar los argumentos como colección.

+0

+1 para mostrar las compilaciones en. –

Cuestiones relacionadas