ProgramaciónDesarrollador Java

¿Qué son los varargs (argumentos de longitud variable) en Java, cómo funcionan y qué trampas existen al usarlos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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

¿Cómo funciona?

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:

  • Varargs debe ser el último parámetro en la lista de parámetros del método.
  • Solo se permite un parámetro varargs en un método.
  • Puede haber ambigüedades en la llamada si hay sobrecarga entre un array y varargs, así como entre diferentes tipos de varargs.
  • Al pasar null a varargs, el método recibirá null, ¡no un array vacío!

Pregunta capciosa

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

Ejemplos de errores reales debido a la falta de conocimiento sobre las particularidades del tema


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.