SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 1/9
Dark[byte]
Java – Argumentos variables (VarArgs)
En Java existe la posibilidad de llamar a un método con un numero de argumentos variable, ósea un
numero de argumentos indefinido o desconocido. Esta posibilidad del lenguaje se llama abreviada y en
ingles: VarArgs, y no ah sido “oficialmente” posible hasta la salida de J2SE 5.0. Veamos el antes y el
después.
Antes de J2SE 5.0
Cuando necesitamos de un método que acepte una cantidad indeterminada de valores podemos usar un
arreglo u otro tipo de colección, veamos un ejemplo con un array:
Este método suma todos los números del arreglo pasado como argumento y nos retorna el resultado,
podemos invocarlo de la siguiente forma:
Así que como vemos podríamos crear un arreglo con la cantidad de números que quisiéramos y
pasárselos a nuestro método sumar(int[] nums) al cual no le importara cuantos argumentos lleguen.
Si no usáramos ni un arreglo o colección para esta tarea, que haríamos entonces?, podríamos crear un
método y sobrecargarlo con un numero diferente de parámetros cuantas veces necesitemos:
1
2
3
4
5
6
7
8
9
10
11
...
int sumar(int[] nums) {
int total = 0;
for (int i=0 ; i < nums.length ; i++) {
total += nums[i];
}
return total
}
...
1
2
3
4
...
int[] array = { 1, 2, 3, 4, 5 };
sumar(array);
...
1 ...
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 2/9
No es una alternativa flexible, es limitada, ocupa mas espacio y es poco elegante. Sin duda nos
quedamos con el arreglo.
Sin embargo el ejemplo visto de argumentos variables no es nada nuevo para nadie en Java, que tal el
famoso método main (String[] args) ?, veamos:
Luego de compilar este EjemploMain.java lo ejecutamos de la siguiente forma:
java -classpath [Ruta de clases (donde esta nuestro EjemploMain.class)] EjemploMain Hola
Si lo tenemos en un tarro (.jar) lo ejecutamos de la siguiente forma:
java -jar [Ruta del archivo jar] Hola a todo el Mundo
La salida es:
Lista de argumentos:
0- Hola
1- a
2- todo
3- el
4- Mundo
Como podemos observar, cualquier aplicación Java ejecutable puede recibir una cantidad de argumentos
variable al ser invocada en su método main (String[] args).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
int sumar(int a, int b) {
return (a + b);
}
int sumar(int a, int b, int c) {
return (a + b + c);
}
int sumar(int a, int b, int c, int d) {
return (a + b + c + d);
}
int sumar(int a, int b, int c, int d, int e) {
return (a + b + c + d + e);
}
...
1
2
3
4
5
6
7
8
9
10
class EjemploMain {
public static void main(String[] args) {
System.out.println("Lista de argumentos:");
for (int i = 0 ; i < args.length ; i++) {
System.out.println(i + "- " + args[i]);
}
}
}
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 3/9
Desde J2SE 5.0
Desde a partir de la versión J2SE 5.0 el lenguaje tiene oficialmente su truco de varargs el cual nos facilita
un poco la tarea de pasar argumentos variables a un método, de hecho el SDK de Java hace uso de las
varargs pudiéndose observar por ejemplo en el código fuente de java.lang.Class y en muchas otras
clases.
Ahora veamos como aplicar la nueva sintaxis en el ejemplo visto anteriormente de sumar (int[] nums):
Hasta aquí el único cambio que apreciamos es como quedan declarados los argumentos de nuestro
método con el “…“:
Sin embargo esta ves para llamar a nuestro método lo haremos de la siguiente manera:
A partir de ahora lo que hacemos es ahorrarnos tener que crear el arreglo nosotros mismos, ya que ah
quedado en manos del compilador gracias al “…“, la llamada que escribimos como: sumar(1, 2, 3, 4, 5),
será convertida automáticamente por el compilador en el equivalente: sumar(new int[] {1, 2, 3, 4,
5}).
También podemos llamar a nuestro void main (String[] args) como void main (String … args),
obteniendo los mismos resultados en los dos casos.
– Argumentos variables junto a otros parametros –
Si lo necesitamos podemos mesclar el uso de varargs con otros parámetros, aunque con ciertas
1
2
3
4
5
6
7
8
9
10
11
...
int sumar(int... nums) {
int total = 0;
for (int i=0 ; i < nums.length ; i++) {
total += nums[i];
}
return total;
}
...
1
2
3
...
int sumar(int... nums)
...
1
2
3
...
sumar(1, 2, 3, 4, 5);
...
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 4/9
Si lo necesitamos podemos mesclar el uso de varargs con otros parámetros, aunque con ciertas
limitaciones, ya que podemos declarar varios parámetros simples pero solo podemos declarar un vararg,
es decir que solo se acepta un vararg por método, y además este debe ir siempre último en los
parámetros del método. Por ejemplo:
Si llamamos a este método como tablaMultiplicar(5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), nos imprimiría por
pantalla la tabla de multiplicar por 5. La salida es:
Tabla de multiplicar por: 5
0 x 5 = 0
1 x 5 = 5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
7 x 5 = 35
8 x 5 = 40
9 x 5 = 45
10 x 5 = 50
Formular el método anterior de la siguiente forma no seria sintácticamente legal por lo que no
podríamos compilarlo:
El compilador nos marcaria errores en la línea de void tablaMultiplicar (in… nums, int n) diciendo “)”
expected y “;” expected.
– Arreglos de argumentos variables –
Una sintaxis admitida pero de uso poco frecuente es la de declarar un parámetro que recibe un numero
variable de arreglos. Véase:
1
2
3
4
5
6
7
8
9
...
void tablaMultiplicar(int n, int... nums) {
System.out.println("Tabla de multiplicar por: " + n);
for (int i=0 ; i < nums.length ; i++) {
System.out.println(nums[i] + " x " + n + " = " + (nums[i] * n));
}
}
...
1
2
3
4
5
...
void tablaMultiplicar(in... nums, int n) {
...
}
...
1 class VarArgsArray {
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 5/9
La salida es:
Arreglo: 0
a
b
c
Arreglo: 1
d
e
f
Arreglo: 2
g
h
i
Como vemos, al método void varArgsArray (char[]… letras) podemos pasarle una indefinida cantidad
de arreglos de caracteres, y para recorrerlos usamos dos bucles for anidados como cuando trabajamos
con arreglos multi-dimensionales.
– Problemas de ambiguedad –
Existen algunas situaciones en las cuales el compilador nos dará problemas en el momento de compilar.
Veamos:
Caso 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class VarArgsArray {
public static void main(String[] args) {
char[] abc = {'a', 'b', 'c'};
char[] def = {'d', 'e', 'f'};
char[] ghi = {'g', 'h', 'i'};
varArgsArray(abc, def, ghi);
}
static void varArgsArray(char[]... letras) {
for (int i = 0; i < letras.length; i++) {
System.out.println("Arreglo: " + i);
for (int j = 0; j < letras[i].length; j++) {
System.out.println(letras[i][j]);
}
}
}
}
1 class VarArgs {
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 6/9
La salida de compilación es:
javac VarArgs.java

VarArgs.java:9: cannot declare both print(java.lang.String[]) and print(java.lang.String…) in
VarArgs
void print (String[] strings)
^
1 error
Aquí la sobrecarga de los métodos void print(…) no se puede realizar porque tener String… varStrings
como parámetro es equivalente a tener String[] arrayStrings.
Caso 2:
La salida de compilación es:
javac VarArgs.java

VarArgs.java:6: reference to print is ambiguous, both method print(java.lang.String…) in VarA
rgs and method print(java.lang.String,java.lang.String…) in VarArgs match
print(“un string”, “otro string”);
^
1 error
Este es un caso obvio, los dos métodos void print(…) tienen parámetros que esperan una cantidad
variable de argumentos del mismo tipo de objeto.
Caso 3:
1
2
3
4
5
6
7
8
9
10
class VarArgs {
void print(String... varStrings) {
//algún código
}
void print(String[] arrayStrings) {
//algún código
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class VarArgs {
public static void main(String[] args) {
print(un string, otro string);
}
static void print(String... varStrings) {
//algún código
}
static void print(String oneString, String... varStrings) {
//algún código
}
}
1 class VarArgs {
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 7/9
La salida de compilación es:
javac VarArgsjava

VarArgsjava:6: reference to print is ambiguous, both method print(int…) in VarArgs and
method print(double…) in VarArgs match
print(1, 2, 3, 4, 5);
^
1 error
Aquí tenemos un “bug”, es un problema del compilador y esta reportado (con una prioridad de “Very
Low”) en la base de datos de bugs de Sun Mycrosystems como se puede ver mejor explicado en este
enlace (h p://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6199075) .
Mientras tanto una forma de solucionar este problema seria utilizar argumentos variables solo en uno de
los métodos y utilizar un arreglo en el otro:
Este código compila sin problemas pero nos deja sin poder aprovechar el uso de argumentos variables.
Una mejor solución seria usar los wrappers correspondientes para int y double (Integer y Double
respectivamente):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class VarArgs {
public static void main(String[] args) {
print(1, 2, 3, 4, 5);
print(1.0, 2.0, 3.0, 4.0, 5.0);
}
static void print(int... ints) {
//algún código
}
static void print(double... doubles) {
//algún código
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class VarArgs {
public static void main(String[] args) {
print(new int[] { 1, 2, 3, 4, 5 });
print(1.0, 2.0, 3.0, 4.0, 5.0);
}
static void print (int[] ints) {
//algún código
}
static void print (Double... doubles) {
//algún código
}
}
1 class VarArgs {
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 8/9
Este código compila sin problemas y nos permite seguir aprovechando los argumentos variables.
Ejemplos:
* Java – VarArgs (h ps://darkbyteblog.wordpress.com/2011/01/20/varargs/)
argumentos variables , java , parametros variables , varargs
Esta entrada se publicó el enero 20, 2011, 2:50 am y se archivó como Informática, Java. Puedes seguir
cualquier respuesta a esta entrada a través de RSS 2.0. Puedes dejar una respuesta, o trackback desde tu
propio sitio.
COMENTARIOS (2)
#1 por Diego el marzo 3, 2012 - 12:16 am
Excelente articulo me ha servido…. de mucho Gracias (y)
5
2
i
Rate This
#2 por Dark[byte] el marzo 9, 2012 - 2:46 pm
Gracias, salu2!.
2
1
i
Rate This
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class VarArgs {
public static void main(String[] args) {
print(1, 2, 3, 4, 5);
print(1.0, 2.0, 3.0, 4.0, 5.0);
}
static void print(Integer... ints) {
//algún código
}
static void print(Double... doubles) {
//algún código
}
}
18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte]
https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 9/9
Blog de WordPress.com.

Más contenido relacionado

La actualidad más candente

Instrucciones de control de salto
Instrucciones de control de saltoInstrucciones de control de salto
Instrucciones de control de saltoAbrirllave
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual Coswchavez
 
Chuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesChuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesAbrirllave
 
Mule Librerias en Java
Mule Librerias en JavaMule Librerias en Java
Mule Librerias en JavaManuel Antonio
 
Sesión 7 matlab - Operadores lógicos y relacionales
Sesión 7 matlab - Operadores lógicos y relacionalesSesión 7 matlab - Operadores lógicos y relacionales
Sesión 7 matlab - Operadores lógicos y relacionalesmatlab_usc
 
Elementos del lenguaje java
Elementos del lenguaje javaElementos del lenguaje java
Elementos del lenguaje javaMarisol Henao
 
Funciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenierosFunciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenierosMaria jose Ramirez perez
 
Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9Eudris Cabrera
 
Programación C++
Programación C++Programación C++
Programación C++Juan Islas
 
Taller de graficación
Taller de graficaciónTaller de graficación
Taller de graficaciónjhonlopera2
 
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?Agile Spain
 
Instituto tecnológico particular
Instituto tecnológico particularInstituto tecnológico particular
Instituto tecnológico particularCarlota Guzman
 
Estructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigoEstructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigoAbrirllave
 

La actualidad más candente (20)

Instrucciones de control de salto
Instrucciones de control de saltoInstrucciones de control de salto
Instrucciones de control de salto
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual C
 
Chuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesChuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantes
 
Mule Librerias en Java
Mule Librerias en JavaMule Librerias en Java
Mule Librerias en Java
 
Sesión 7 matlab - Operadores lógicos y relacionales
Sesión 7 matlab - Operadores lógicos y relacionalesSesión 7 matlab - Operadores lógicos y relacionales
Sesión 7 matlab - Operadores lógicos y relacionales
 
Librerias ansi c
Librerias ansi cLibrerias ansi c
Librerias ansi c
 
Strrev
StrrevStrrev
Strrev
 
Funciones str
Funciones strFunciones str
Funciones str
 
Java básico
Java  básicoJava  básico
Java básico
 
Elementos del lenguaje java
Elementos del lenguaje javaElementos del lenguaje java
Elementos del lenguaje java
 
Funciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenierosFunciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenieros
 
Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9
 
Programación C++
Programación C++Programación C++
Programación C++
 
Bibliotecas de c_
Bibliotecas de c_Bibliotecas de c_
Bibliotecas de c_
 
Taller de graficación
Taller de graficaciónTaller de graficación
Taller de graficación
 
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
 
Octave
OctaveOctave
Octave
 
Instituto tecnológico particular
Instituto tecnológico particularInstituto tecnológico particular
Instituto tecnológico particular
 
Estructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigoEstructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigo
 
Python para principiantes
Python para principiantesPython para principiantes
Python para principiantes
 

Similar a Java argumentos variables

Similar a Java argumentos variables (20)

Taller de Pascal 01.pptx
Taller de Pascal 01.pptxTaller de Pascal 01.pptx
Taller de Pascal 01.pptx
 
02 Bases Del Lenguaje Java
02   Bases Del Lenguaje Java02   Bases Del Lenguaje Java
02 Bases Del Lenguaje Java
 
Programacion C#
Programacion C#Programacion C#
Programacion C#
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
sentenciareturnymetodos
sentenciareturnymetodossentenciareturnymetodos
sentenciareturnymetodos
 
Matlab_basic.pptx
Matlab_basic.pptxMatlab_basic.pptx
Matlab_basic.pptx
 
Codigo
CodigoCodigo
Codigo
 
cap7.pdf
cap7.pdfcap7.pdf
cap7.pdf
 
Manuales ...
Manuales ...Manuales ...
Manuales ...
 
Aa javaaa intro
Aa javaaa introAa javaaa intro
Aa javaaa intro
 
Computacion aplicada
Computacion aplicadaComputacion aplicada
Computacion aplicada
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
 
Matlab2
Matlab2Matlab2
Matlab2
 
Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01
 
Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01
 
Matlab teoria
Matlab teoriaMatlab teoria
Matlab teoria
 
Best Practices
Best PracticesBest Practices
Best Practices
 
2,1 elementos de java script
2,1 elementos de java script2,1 elementos de java script
2,1 elementos de java script
 
Introduccion java
Introduccion javaIntroduccion java
Introduccion java
 
Lenguaje de Programacion - Java
Lenguaje de Programacion - JavaLenguaje de Programacion - Java
Lenguaje de Programacion - Java
 

Más de Efrain Mflo

Administracion de proyectos
Administracion de proyectosAdministracion de proyectos
Administracion de proyectosEfrain Mflo
 
Metodos almacenaje
Metodos almacenajeMetodos almacenaje
Metodos almacenajeEfrain Mflo
 
Solucion de problemas por el metodo grafico
Solucion de problemas por el metodo graficoSolucion de problemas por el metodo grafico
Solucion de problemas por el metodo graficoEfrain Mflo
 
Reportes en lenguaje java
Reportes en lenguaje javaReportes en lenguaje java
Reportes en lenguaje javaEfrain Mflo
 
Metodos Numericos - Dígitos significativos
Metodos Numericos - Dígitos significativosMetodos Numericos - Dígitos significativos
Metodos Numericos - Dígitos significativosEfrain Mflo
 
Metodos Numericos - Bisección
Metodos Numericos - BisecciónMetodos Numericos - Bisección
Metodos Numericos - BisecciónEfrain Mflo
 
Ficha de acompañamiento y monitoreo al docente 2015 primaria
Ficha de acompañamiento y monitoreo al docente 2015 primariaFicha de acompañamiento y monitoreo al docente 2015 primaria
Ficha de acompañamiento y monitoreo al docente 2015 primariaEfrain Mflo
 

Más de Efrain Mflo (8)

Administracion de proyectos
Administracion de proyectosAdministracion de proyectos
Administracion de proyectos
 
Metodos almacenaje
Metodos almacenajeMetodos almacenaje
Metodos almacenaje
 
Solucion de problemas por el metodo grafico
Solucion de problemas por el metodo graficoSolucion de problemas por el metodo grafico
Solucion de problemas por el metodo grafico
 
Moodle
MoodleMoodle
Moodle
 
Reportes en lenguaje java
Reportes en lenguaje javaReportes en lenguaje java
Reportes en lenguaje java
 
Metodos Numericos - Dígitos significativos
Metodos Numericos - Dígitos significativosMetodos Numericos - Dígitos significativos
Metodos Numericos - Dígitos significativos
 
Metodos Numericos - Bisección
Metodos Numericos - BisecciónMetodos Numericos - Bisección
Metodos Numericos - Bisección
 
Ficha de acompañamiento y monitoreo al docente 2015 primaria
Ficha de acompañamiento y monitoreo al docente 2015 primariaFicha de acompañamiento y monitoreo al docente 2015 primaria
Ficha de acompañamiento y monitoreo al docente 2015 primaria
 

Java argumentos variables

  • 1. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 1/9 Dark[byte] Java – Argumentos variables (VarArgs) En Java existe la posibilidad de llamar a un método con un numero de argumentos variable, ósea un numero de argumentos indefinido o desconocido. Esta posibilidad del lenguaje se llama abreviada y en ingles: VarArgs, y no ah sido “oficialmente” posible hasta la salida de J2SE 5.0. Veamos el antes y el después. Antes de J2SE 5.0 Cuando necesitamos de un método que acepte una cantidad indeterminada de valores podemos usar un arreglo u otro tipo de colección, veamos un ejemplo con un array: Este método suma todos los números del arreglo pasado como argumento y nos retorna el resultado, podemos invocarlo de la siguiente forma: Así que como vemos podríamos crear un arreglo con la cantidad de números que quisiéramos y pasárselos a nuestro método sumar(int[] nums) al cual no le importara cuantos argumentos lleguen. Si no usáramos ni un arreglo o colección para esta tarea, que haríamos entonces?, podríamos crear un método y sobrecargarlo con un numero diferente de parámetros cuantas veces necesitemos: 1 2 3 4 5 6 7 8 9 10 11 ... int sumar(int[] nums) { int total = 0; for (int i=0 ; i < nums.length ; i++) { total += nums[i]; } return total } ... 1 2 3 4 ... int[] array = { 1, 2, 3, 4, 5 }; sumar(array); ... 1 ...
  • 2. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 2/9 No es una alternativa flexible, es limitada, ocupa mas espacio y es poco elegante. Sin duda nos quedamos con el arreglo. Sin embargo el ejemplo visto de argumentos variables no es nada nuevo para nadie en Java, que tal el famoso método main (String[] args) ?, veamos: Luego de compilar este EjemploMain.java lo ejecutamos de la siguiente forma: java -classpath [Ruta de clases (donde esta nuestro EjemploMain.class)] EjemploMain Hola Si lo tenemos en un tarro (.jar) lo ejecutamos de la siguiente forma: java -jar [Ruta del archivo jar] Hola a todo el Mundo La salida es: Lista de argumentos: 0- Hola 1- a 2- todo 3- el 4- Mundo Como podemos observar, cualquier aplicación Java ejecutable puede recibir una cantidad de argumentos variable al ser invocada en su método main (String[] args). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... int sumar(int a, int b) { return (a + b); } int sumar(int a, int b, int c) { return (a + b + c); } int sumar(int a, int b, int c, int d) { return (a + b + c + d); } int sumar(int a, int b, int c, int d, int e) { return (a + b + c + d + e); } ... 1 2 3 4 5 6 7 8 9 10 class EjemploMain { public static void main(String[] args) { System.out.println("Lista de argumentos:"); for (int i = 0 ; i < args.length ; i++) { System.out.println(i + "- " + args[i]); } } }
  • 3. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 3/9 Desde J2SE 5.0 Desde a partir de la versión J2SE 5.0 el lenguaje tiene oficialmente su truco de varargs el cual nos facilita un poco la tarea de pasar argumentos variables a un método, de hecho el SDK de Java hace uso de las varargs pudiéndose observar por ejemplo en el código fuente de java.lang.Class y en muchas otras clases. Ahora veamos como aplicar la nueva sintaxis en el ejemplo visto anteriormente de sumar (int[] nums): Hasta aquí el único cambio que apreciamos es como quedan declarados los argumentos de nuestro método con el “…“: Sin embargo esta ves para llamar a nuestro método lo haremos de la siguiente manera: A partir de ahora lo que hacemos es ahorrarnos tener que crear el arreglo nosotros mismos, ya que ah quedado en manos del compilador gracias al “…“, la llamada que escribimos como: sumar(1, 2, 3, 4, 5), será convertida automáticamente por el compilador en el equivalente: sumar(new int[] {1, 2, 3, 4, 5}). También podemos llamar a nuestro void main (String[] args) como void main (String … args), obteniendo los mismos resultados en los dos casos. – Argumentos variables junto a otros parametros – Si lo necesitamos podemos mesclar el uso de varargs con otros parámetros, aunque con ciertas 1 2 3 4 5 6 7 8 9 10 11 ... int sumar(int... nums) { int total = 0; for (int i=0 ; i < nums.length ; i++) { total += nums[i]; } return total; } ... 1 2 3 ... int sumar(int... nums) ... 1 2 3 ... sumar(1, 2, 3, 4, 5); ...
  • 4. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 4/9 Si lo necesitamos podemos mesclar el uso de varargs con otros parámetros, aunque con ciertas limitaciones, ya que podemos declarar varios parámetros simples pero solo podemos declarar un vararg, es decir que solo se acepta un vararg por método, y además este debe ir siempre último en los parámetros del método. Por ejemplo: Si llamamos a este método como tablaMultiplicar(5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), nos imprimiría por pantalla la tabla de multiplicar por 5. La salida es: Tabla de multiplicar por: 5 0 x 5 = 0 1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 6 x 5 = 30 7 x 5 = 35 8 x 5 = 40 9 x 5 = 45 10 x 5 = 50 Formular el método anterior de la siguiente forma no seria sintácticamente legal por lo que no podríamos compilarlo: El compilador nos marcaria errores en la línea de void tablaMultiplicar (in… nums, int n) diciendo “)” expected y “;” expected. – Arreglos de argumentos variables – Una sintaxis admitida pero de uso poco frecuente es la de declarar un parámetro que recibe un numero variable de arreglos. Véase: 1 2 3 4 5 6 7 8 9 ... void tablaMultiplicar(int n, int... nums) { System.out.println("Tabla de multiplicar por: " + n); for (int i=0 ; i < nums.length ; i++) { System.out.println(nums[i] + " x " + n + " = " + (nums[i] * n)); } } ... 1 2 3 4 5 ... void tablaMultiplicar(in... nums, int n) { ... } ... 1 class VarArgsArray {
  • 5. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 5/9 La salida es: Arreglo: 0 a b c Arreglo: 1 d e f Arreglo: 2 g h i Como vemos, al método void varArgsArray (char[]… letras) podemos pasarle una indefinida cantidad de arreglos de caracteres, y para recorrerlos usamos dos bucles for anidados como cuando trabajamos con arreglos multi-dimensionales. – Problemas de ambiguedad – Existen algunas situaciones en las cuales el compilador nos dará problemas en el momento de compilar. Veamos: Caso 1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class VarArgsArray { public static void main(String[] args) { char[] abc = {'a', 'b', 'c'}; char[] def = {'d', 'e', 'f'}; char[] ghi = {'g', 'h', 'i'}; varArgsArray(abc, def, ghi); } static void varArgsArray(char[]... letras) { for (int i = 0; i < letras.length; i++) { System.out.println("Arreglo: " + i); for (int j = 0; j < letras[i].length; j++) { System.out.println(letras[i][j]); } } } } 1 class VarArgs {
  • 6. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 6/9 La salida de compilación es: javac VarArgs.java VarArgs.java:9: cannot declare both print(java.lang.String[]) and print(java.lang.String…) in VarArgs void print (String[] strings) ^ 1 error Aquí la sobrecarga de los métodos void print(…) no se puede realizar porque tener String… varStrings como parámetro es equivalente a tener String[] arrayStrings. Caso 2: La salida de compilación es: javac VarArgs.java VarArgs.java:6: reference to print is ambiguous, both method print(java.lang.String…) in VarA rgs and method print(java.lang.String,java.lang.String…) in VarArgs match print(“un string”, “otro string”); ^ 1 error Este es un caso obvio, los dos métodos void print(…) tienen parámetros que esperan una cantidad variable de argumentos del mismo tipo de objeto. Caso 3: 1 2 3 4 5 6 7 8 9 10 class VarArgs { void print(String... varStrings) { //algún código } void print(String[] arrayStrings) { //algún código } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class VarArgs { public static void main(String[] args) { print(un string, otro string); } static void print(String... varStrings) { //algún código } static void print(String oneString, String... varStrings) { //algún código } } 1 class VarArgs {
  • 7. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 7/9 La salida de compilación es: javac VarArgsjava VarArgsjava:6: reference to print is ambiguous, both method print(int…) in VarArgs and method print(double…) in VarArgs match print(1, 2, 3, 4, 5); ^ 1 error Aquí tenemos un “bug”, es un problema del compilador y esta reportado (con una prioridad de “Very Low”) en la base de datos de bugs de Sun Mycrosystems como se puede ver mejor explicado en este enlace (h p://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6199075) . Mientras tanto una forma de solucionar este problema seria utilizar argumentos variables solo en uno de los métodos y utilizar un arreglo en el otro: Este código compila sin problemas pero nos deja sin poder aprovechar el uso de argumentos variables. Una mejor solución seria usar los wrappers correspondientes para int y double (Integer y Double respectivamente): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class VarArgs { public static void main(String[] args) { print(1, 2, 3, 4, 5); print(1.0, 2.0, 3.0, 4.0, 5.0); } static void print(int... ints) { //algún código } static void print(double... doubles) { //algún código } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class VarArgs { public static void main(String[] args) { print(new int[] { 1, 2, 3, 4, 5 }); print(1.0, 2.0, 3.0, 4.0, 5.0); } static void print (int[] ints) { //algún código } static void print (Double... doubles) { //algún código } } 1 class VarArgs {
  • 8. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 8/9 Este código compila sin problemas y nos permite seguir aprovechando los argumentos variables. Ejemplos: * Java – VarArgs (h ps://darkbyteblog.wordpress.com/2011/01/20/varargs/) argumentos variables , java , parametros variables , varargs Esta entrada se publicó el enero 20, 2011, 2:50 am y se archivó como Informática, Java. Puedes seguir cualquier respuesta a esta entrada a través de RSS 2.0. Puedes dejar una respuesta, o trackback desde tu propio sitio. COMENTARIOS (2) #1 por Diego el marzo 3, 2012 - 12:16 am Excelente articulo me ha servido…. de mucho Gracias (y) 5 2 i Rate This #2 por Dark[byte] el marzo 9, 2012 - 2:46 pm Gracias, salu2!. 2 1 i Rate This 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class VarArgs { public static void main(String[] args) { print(1, 2, 3, 4, 5); print(1.0, 2.0, 3.0, 4.0, 5.0); } static void print(Integer... ints) { //algún código } static void print(Double... doubles) { //algún código } }
  • 9. 18/11/2017 Java – Argumentos variables (VarArgs) | Dark[byte] https://darkbyteblog.wordpress.com/2011/01/20/java-argumentos-variables/ 9/9 Blog de WordPress.com.