terça-feira, 2 de setembro de 2008

Novidades do Java 5.0: Varargs

Suponhamos que você deseja criar um método que faz a soma dos inteiros passados como parâmetros nele. Como você faria isso antes do java 5? Bem, teríamos que fazer algo do tipo:

public int somar(int a) {
return a;
}

public int somar(int a, int b) {
return a + b;
}

public int somar(int a, int b, int c){
return somar(a,b) + c;
}
...

O problema é que para conseguir suportar mais argumentos você teria que criar mais métodos sobrecarregados, tornando a sua classe gigante e difícil de manter. A partir do java 5 ficou muito mais fácil criar essa funcionalidade. Através da sintaxe de argumentos variáveis ou varargs. Então os métodos que nós escrevemos antes ficariam todos resumidos em um método assim:

public int somar(int... args) {
int total = 0;
for (int i = 0; i < args.lenght; i++)
total += args[i];
return total;
}

chamadas válidas ao método
System.out.println(somar()); imprime 0
System.out.println(somar(1)); imprime 1
System.out.println(somar(1,2)); imprime 3
System.out.println(somar(1,2,3)); imprime 6

Acho que você notou que o argumento variável nada mais é que um array de objetos ou de primitivos do tipo informado no parâmetro né? Só que o recurso é mais interessante porque me dá a flexibilidade de passar quantos parâmetros eu quiser sem precisar declará-los em um array. Agora vejamos as regras do varargs:
  1. Todo vararg tem um tipo definido. Como no nosso exemplo o tipo foi int.
  2. Para definir que o parâmetro é vararg use ... (três pontinhos) depois do tipo. Cuidado para não confundir com a sintaxe de arrays, ainda não vimos arrays mas vamos adiantar a sintaxe aqui: um array pode ser definido: int[] a ou int a[]. Um vararg só pode ser int... a e NUNCA int a...
  3. Eu posso ter vários parâmetros junto com o vararg, porém só posso ter um ÚNICO vararg como parâmetro e este precisa ser OBRIGATORIAMENTE o último deles. Assim é válido ter: public void somar(String msg, int... a); mas é inválido: public void somar(int... a , String msg);
Por último devemos saber que acessamos vararg como se tivéssemos acessando um array do tipo informado. Assim você pode usar qualquer estrutura de laço ou índice, como for por exemplo.
Até o próximo post.

Um comentário:

  1. Cara é isso aí,
    estava a procura de teoria sobre varargs e no seu blog está muito fácil de entender


    valeu

    Eduardo

    ResponderExcluir