Outro recurso interessante do Java Varargs.
Imagine que você tem que criar um método que calcule a média dos números passados como parâmetro.
De início, você cria um método que recebe 2 parâmetros.
Depois você vê a necessidade de se criar o mesmo método mas passando agora 4 parâmetros.
Depois ainda você sente a necessidade de criar o mesmo método só que agora passando 7 parâmetros.
Para resolver isso você poderia usar o recurso de sobrecarga e sempre mantendo os métodos com o mesmo nome, porém com lista de parâmetros diferentes.
Agora se tivesse que criar um método, que em determinado momento você recebesse 3 parâmetros, em outro momento recebesse 4, em outro 5, em outro 20, e assim por diante, seria inviável ficar criando vários métodos para resolver esse problema.
Para criar um método que recebesse um número indefinido de parâmetros você possui hoje o recurso de Varargs, que nada mais é do que "dizer" pro Java que um determinada parâmetro de seu método poderá receber 1 parâmetro, 2 parâmetros ou 200.
Veja a sintaxe para a declaração desse método:
public tipoDeRetorno nomeDoMetodo(TipoDeParametro... nomeDoParametro){
Ao usar reticências depois do
tipo de parâmetro você tem que dar um nome para esse parâmetro.
Dessa maneira para esse parâmetro você pode passar vários valores. E dentro do método você irá trabalhar com esse parâmetro como se fosse um array. Veja agora um exemplo:
//Declaração do método
public static Double calculaMedias(Double... numeros){
//O parâmetro 'numeros' tem que ser tratado como um 'array'
Integer tamanhoDoArray = numeros.length; //pega o tamanho do array
Double soma = 0.0; //variável que irá somar todas as ocorrências de números dentro do 'array'
Double media = 0.0; //variável de retorno
if (tamanhoDoArray > 0){ //se o 'array' possuir mais do que 0 números, significa que ele não está vazio
for (int i = 0; i < tamanhoDoArray; i++){ // percorre o array pegando todos os seus números e somando
soma += numeros[i];
}
media = soma / tamanhoDoArray; // no final, ainda dentro do if, calcula a média
}
return media; // retorna a média
}
//método main
public static void main(String[] args) {
//declaração de alguns números com valores diferentes
Double n1 = 10.0;
Double n2 = 20.0;
Double n3 = 30.0;
Double n4 = 40.0;
Double n5 = 50.0;
Double n6 = 60.0;
Double n7 = 70.0;
Double n8 = 80.0;
Double n9 = 90.0;
Double n10 = 100.0;
//dentro do método 'System.out.println();' é chamado o método 'calculaMedias();' passando os parâmetros
//o calculo é retornado e impresso
//Veja que nesse primeiro momento são passados 2 valores
System.out.println(calculaMedias(n1,n2));
System.out.println(calculaMedias(n1,n2,n3,n4)); //Agora são passados 4 valores
System.out.println(calculaMedias(n1,n2,n3,n4,n5,n6)); //Agora são passados 6 valores
System.out.println(calculaMedias(n1,n2,n3,n4,n5,n6,n7,n8,n9,n10)); //Agora são passados 10 valores
System.out.println(calculaMedias(n3,n6,n10,n1,n5)); //Agora são passados 5 valores
System.out.println(calculaMedias()); //Agora são passados 0 valores
// repare que nessa última chada não são passados valores para o
//método e assim ele não irá entrar no 'if' pois o '.length' é 0
}
O resultado da execução disso seria:
15.0
25.0
35.0
55.0
50.0
0.0
O método que acabei de mostrar só tem 1 parâmetro, porém ele pode possui um número indefinido de valores.
Esse seu método pode ter mais de um parâmetro veja a sintaxe:
public tipoDeRetorno nomeDoMetodo(Tipo parametro1, Tipo, parametro2, TipoDeParametro... nomeDoParametro){
Com isso você pode passar passar por exemplo 2 Srtings, e depois uma várias Strings para o último parâmetro.
Observação 1: É extremamente importante que o parâmetro que irá receber vários valores (vararg) sempre fique por último na declaração do método, senão não irá compilar.
Observação 2: Só pode haver um vararg por método.
Ou seja, sempre delare o vararg no final do métodos, veja abaixo exemplos Certos e Corretos de declaração:
Maneiras CORRETAS de delcaração de métodos com varargs
public void metodoA(int a, int b, int c, Double... variavel){}
public void metodoB(String a, int... variavel){}
public void metodoC(String a, int b, Double c, String... variavel){}
public void metodoD(Double a, Integer... variavel){}
//Veja abaixo, o varargs pode ser de qualquer tipo de classe
public void metodoE(Double a, int b, Pessoa... variavel){}
public void metodoF(Double a, char b, int c, String d, Notas... variavel){}
public void metodoG(Double a, Animal... variavel){}
public void metodoH(Double a, Integer b, FigurasGeometricas... variavel){}
//Ou até mesmo Object
public void metodoI(char a, String b, Object... variavel){}
//Ou como já vimos, somente possuindo o 'vararg'
public void metodoI(Object... variavel){}
Maneiras
[u]IN[color=red] [/color]CORRETAS de delcaração de métodos com
varargs
//Nenhum dos casos abaixo são compilados
//Errado pois posssui 2 varargs
public void metodoA(Double... variavel, Double... variavel2){}
//Errado pois posssui começa a lista de parâmetros com varargs
public void metodoB(Double... variavel, int x){}
//Errado pois o varargs está no meio do método
public void metodoC(String a, String... variavel, Double c){}
//Leis simples para vaarargs:
// 1: Só pode existir 1 e apenas 1 vararg por metodo
// 2: O vararg deve ser obrigatóriamente o último parâmetro a ser delarado
// 3: Além do vararg, pode existir ou não outros parâmetros no método, desde que respeitem as leis 1 e 2
É isso ai gente qualquer dúvida ou erro que eu tenha cometido postem ai. Abraço a todos. :D Att.