Java Varargs (argumentos variables) con ejemplos

En este artículo, aprenderá sobre varargs en Java con la ayuda de ejemplos. También aprenderá cuándo usar varargs y cuándo no.

¿Qué es varargs en Java?

Supongamos que está creando un método Java. Sin embargo, no está seguro de cuántos argumentos va a aceptar su método. Para abordar este problema, Java 1.5 introdujo varargs.

Varargs es un nombre corto para argumentos variables. En Java, un argumento de un método puede aceptar un número arbitrario de valores. Este argumento que puede aceptar un número variable de valores se llama varargs.

La sintaxis para implementar varargs es la siguiente:

 accessModifier methodName (tipo de datos… arg) (// cuerpo del método)

Para definir vararg, (tres puntos) se usa en el parámetro formal de un método.

Un método que toma un número variable de argumentos se denomina método variable-arity, o simplemente método varargs.

Primero, veamos el ejemplo sin usar varargs:

 class NoVararg ( public int sumNumber(int a, int b)( return a+b; ) public int sumNumber(int a, int b, int c)( return a+b+c; ) public static void main( String() args ) ( NoVararg obj = new NoVararg(); System.out.println(obj.sumNumber(1, 2)); System.out.println(obj.sumNumber(1, 2, 3)); ) )

Cuando ejecute este programa, la salida será:

 3 6

Como puede ver claramente, tuvo que sobrecargar el sumNumber()método para que funcione para 3 argumentos.

¿Qué pasa si el usuario quiere sumar 5 números o 10 o 100?

Esto se puede manejar de manera ordenada con el uso de varargs. Veamos un ejemplo de código:

Ejemplo: trabajo de varargs

 class VarargExample ( public int sumNumber(int… args)( System.out.println("argument length: " + args.length); int sum = 0; for(int x: args)( sum += x; ) return sum; ) public static void main( String() args ) ( VarargExample ex = new VarargExample(); int sum2 = ex.sumNumber(2, 4); System.out.println("sum2 = " + sum2); int sum3 = ex.sumNumber(1, 3, 5); System.out.println("sum3 = " + sum3); int sum4 = ex.sumNumber(1, 3, 5, 7); System.out.println("sum4 = " + sum4); ) )

Cuando ejecute el programa, la salida será:

 longitud del argumento: 2 suma2 = 6 longitud del argumento: 3 suma3 = 9 longitud del argumento: 4 suma4 = 16

Aquí, el sumNumber()método devuelve la suma de los intparámetros que se le pasan (no importa el número de argumentos que se le pasan).

Como puede ver, los varargs pueden ser realmente útiles en algunas situaciones. Sin embargo, si está seguro de la cantidad de argumentos pasados ​​a un método, utilice la sobrecarga de métodos en su lugar. Por ejemplo, si está seguro de que el sumNumber()método se usará solo para calcular la suma de 2 o 3 argumentos, use la sobrecarga como en el primer ejemplo.

Tomemos otro ejemplo. El método format () definido en la biblioteca Java acepta varargs. En JDK, el format()método se define de la siguiente manera:

 formato de cadena estático público (configuración regional l, formato de cadena, objeto … args) (// cuerpo)

Ejemplo: método format ()

 class Company ( public static void main(String() args) ( String siteName = "programiz.com"; int empCount = 6; String type = "tutorial website"; System.out.println( String.format( "Site Name : %s, Emp Count: %d Type: %s", siteName, empCount, type ) ); ) )

Cuando ejecute el programa, la salida será:

 Nombre del sitio: programiz.com, Emp Count: 6 Tipo: sitio web del tutorial 

¿Cómo funciona varargs detrás de escena?

Consideremos el siguiente pseudocódigo:

 public int sumNumber (int… nums) (// cuerpo del método)

La sintaxis le dice al compilador de Java que se puede llamar al método con cero o más argumentos. Como resultado, la variable nums se declara implícitamente como una matriz de tipo int( ). Por lo tanto, dentro del método, se accede a la variable nums utilizando la sintaxis de matriz.

En caso de que no haya argumentos, la longitud de nums es 0.

Sobrecarga de métodos de Varargs

De forma similar a los métodos típicos, puede sobrecargar los métodos vararg.

Lectura recomendada: sobrecarga del método Java

Ejemplo: sobrecarga del método Varargs

 class VarargOverload ( private void test(int… args)( int sum = 0; for (int i: args) ( sum += i; ) System.out.println("sum = " + sum); ) private void test(boolean p, String… args)( boolean negate = !p; System.out.println("negate = " + negate); System.out.println("args.length = "+ args.length); ) public static void main( String() args ) ( VarargOverload obj = new VarargOverload(); obj.test(1, 2, 3); obj.test(true, "hello", "world"); ) ) 

Cuando ejecute el programa, la salida será:

 suma = 6 negar = argumentos falsos longitud = 2

En el programa anterior, el test()método se sobrecarga al cambiar el número de argumentos que acepta.

Cosas para recordar mientras usa Varargs

Aquí hay un par de cosas que debe recordar mientras trabaja con vargars de Java:

1. Al definir la firma del método, mantenga siempre los varargs al final.

El argumento de la variable debe ser el último argumento pasado al método. Consideremos, invocaste un doSomething()método como este:

 hacer algo (1, 2, 3, 4);

Y su doSomething()método se define como:

 // declaración de método incorrecta public void doSomething (int… nums, int p) (// cuerpo del método)

En este caso, el compilador no puede calcular el número de argumentos pasados ​​a nums.

Sin embargo, si define su método como:

 public void doSomething (int p, int… nums) (// cuerpo del método)

El compilador de Java asigna el primer argumento ap, y los intargumentos restantes se asignan a nums.

2. Un método solo puede tener un parámetro varargs.

Por ejemplo, esta declaración de método es incorrecta:

 int doSomething (int p, float … floatNums, double … doubleNums) (// código)

Ambigüedad en la sobrecarga del método Varargs

Consideremos su test()método sobrecargado como este:

 class Demo (prueba de vacío estático (int … vargs) (// cuerpo del método) prueba de vacío estático (int n, int … vargs) (// cuerpo del método))

En el programa anterior, el compilador se confunde si intenta invocar el test()método aunque los test()métodos estén sobrecargados y acepten un número diferente de argumentos.

El compilador no sabe a qué método llamar. El compilador puede pensar que está intentando llamar test(int… vargs)con un argumento varargs. Además, el compilador puede pensar que está intentando llamar test(int n, int… vargs)con el argumento pasado al primer parámetro con el segundo parámetro vacío.

Dado que hay dos posibilidades, causa ambigüedad. Debido a esto, a veces es posible que deba usar dos nombres de métodos diferentes en lugar de sobrecargar el método varargs.

Articulos interesantes...