miércoles, 2 de marzo de 2016

Qué es un método varargs en Java y cómo utilizarlo

Un método varargs es aquel que recibe un número variable de argumentos. Fue introducido en Java 5 y es aplicable también a constructores. Es conocido también como método de argumentos variables. Se caracteriza por utilizar 3 puntos o puntos suspensivos en la declaración de los argumentos.



Un ejemplo de uso que puedes encontrar es en la clase Asynctask de Android, al sobrescribir los métodos doInBackgroud y onProgressUpdate, pero en este artículo voy a utilizar un ejemplo más sencillo.

Vamos a suponer que tenemos una función que devuelve el mayor de dos números, tal que:


    public static int max (int valor1, int valor2) {
        int max = valor1;
        if(valor2>valor1) {
            max = valor2;
        } 
        return max;
    }

No tiene nada en especial, se pasan dos parámetros y devuelve el valor mayor de los parámetros, pero, ¿y si fueran 3 parámetros? ¿y 4? ¿y 5? normalmente y una solución también buena sería pasar un array de enteros, recorrerlo y devolver el valor máximo. Pero hay situaciones en las que un método de argumentos variables puede ser más cómodo o mejor opción.

Nuestro método diseñado para aceptar un número variable de argumentos quedaría:

    public static int max(int... valores){
        int max = Integer.MIN_VALUE;
        for(int valor : valores) {
            if(valor > max)
                max = valor;
        }        
        return max;        
    }

Simplemente se establece el tipo de dato, los 3 puntos y el nombre del argumento. De esta forma podríamos llamar a nuestro método max de la siguiente forma:
  • max() // Si, se puede llamar sin pasar ningún valor
  • max(5)
  • max(5,6)
  • max(6,7,9,8,25,32,4)

Restricciones al usar un método con varargs:
  • No se puede usar más de 1 varargs, lo siguiente sería inválido:
public static int max(int... valores1, int valores2)

  • Si hay otros argumentos, el varargs debe ir al final de la lista:
public static int max(int... valores, String msg) // ERROR
public static int max(String msg, int...valores) // CORRECTO


Un último apunte es que siguen las mismas normas de sobrecarga de métodos por lo que el siguiente código es correcto:


public class EjemploVarargs{

    public static void main(String[] args) {
        System.out.println("Mayor:"+ max(9,6));
    }
    //Método 1
    public static int max (int valor1, int valor2) {
        int max = valor1;
        if(valor2>valor1) {
            max = valor2;
        } 
        return max;
    }
    //Método 2
    public static int max(int... valores){
        int max = Integer.MIN_VALUE;
        for(int valor : valores) {
            if(valor > max)
                max = valor;
        }        
        return max;        
    }    
}

Una duda que puede surgir es en el código anterior al llamar a max pasando 2 valores, ¿qué método se ejecutará? Java buscará el método con los parámetros exactos, si lo encuentra será el que ejecute, en caso de no encontrarlo ejecutará el varargs, por lo que en el ejemplo anterior llamaría al método 1.


No hay comentarios:

Publicar un comentario