Los varargs son una sintaxis que permite a un método recibir un número variable de argumentos de un mismo tipo. Se declaran usando tres puntos:
public void printNames(String... names) { for (String name : names) { System.out.println(name); } }
El parámetro varargs dentro del método es simplemente un array del tipo correspondiente: String[] names en el ejemplo anterior. Se puede llamar al método con cualquier cantidad de argumentos o con un array:
printNames("Igor", "Anna", "Maria"); printNames(new String[] {"Alex", "Inna"});
Particularidades del uso:
Pregunta: ¿Cuál será la longitud del array del parámetro varargs si llamas al método sin pasar argumentos?
Respuesta: En este caso, la variable varargs será una referencia a un array de longitud cero: new String[0]. ¡No será null!
public void foo(Integer... args) { System.out.println(args.length); } // foo(); // Imprimirá: 0
Historia
En la biblioteca de registro había un método log(String... messages). Al llamar a log(null) se producía un NullPointerException dentro del método (se esperaba que messages fuera un array vacío, en su lugar era null). Para solucionar esto, se tuvo que comprobar explícitamente si era null.
Historia
Un desarrollador creó una sobrecarga:
public void doSomething(String[] arr) {...} public void doSomething(String... arr) {...}Al pasar un array, se llamó al método equivocado, lo que provocó la pérdida de parte de los datos. La diferencia entre un array y varargs resultó no ser obvia.
Historia
En el proyecto se agregó un segundo parámetro después de varargs:
public void foo(String... args, int count) {...} // ¡Error de compilación!Esto llevó a un error y a la interrupción de la compilación, porque varargs debe ser el último.