Varargs es una sintaxis especial que permite a un método aceptar un número variable (cualquiera) de argumentos del mismo tipo. En la declaración del método, tal parámetro se indica como Type... name (por ejemplo, int... nums). Dentro del método, los argumentos se perciben como un arreglo normal.
Ejemplo:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
Se puede llamar así:
printNumbers(1, 2, 3, 4); // o printNumbers();
Implementación interna: al llamar a un método con varargs, el compilador crea automáticamente un arreglo del tipo correspondiente.
Limitaciones y detalles:
printNumbers(null) lanzará NPE al intentar iterar.Pregunta: "¿Se puede declarar un método con múltiples parámetros varargs?"
Frecuentemente se equivoca: muchos piensan que se puede declarar public void example(int... a, String... b), pero esto generará un error de compilación.
Respuesta correcta: No, solo se puede tener un parámetro varargs, y debe ser el último.
Historia
En una biblioteca de registro corporativa, se implementaron versiones sobrecargadas de métodos con varargs y arreglos. Al pasar un arreglo en lugar de un conjunto de elementos, se utilizó la versión incorrecta del método, lo que llevó a que el arreglo se registrara como un objeto y no su contenido. Esto causó confusión al analizar los registros.
Historia
En un servicio de integración, la llamada a un método con varargs aceptaba null, sin verificar NPE. La sistema "caía" inesperadamente al intentar iterar sobre los elementos, ya que se esperaba al menos un arreglo vacío.
Historia
En un proyecto de comercio electrónico, se confundieron con las sobrecargas de métodos: había un método
send(String subject, String... emails)y otrosend(String subject, String[] emails). Al pasar un arreglo, el compilador seleccionaba implícitamente el método incorrecto. Resultado: los correos no se enviaban a los clientes.