Neste artigo, você aprenderá sobre varargs em Java com a ajuda de exemplos. Você também aprenderá quando usar varargs e quando não usá-los.
O que é varargs em Java?
Vamos supor que você esteja criando um método Java. No entanto, você não tem certeza de quantos argumentos seu método aceitará. Para resolver esse problema, o Java 1.5 introduziu varargs.
Varargs é um nome curto para argumentos variáveis. Em Java, um argumento de um método pode aceitar um número arbitrário de valores. Este argumento que pode aceitar um número variável de valores é chamado de varargs.
A sintaxe para implementar varargs é a seguinte:
accessModifier methodName (datatype… arg) (// corpo do método)
Para definir vararg, …
(três pontos) é usado no parâmetro formal de um método.
Um método que recebe um número variável de argumentos é chamado de método de aridade variável ou simplesmente método varargs.
Primeiro, vamos olhar o exemplo sem 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)); ) )
Quando você executa este programa, a saída será:
3 6
Como você pode ver claramente, você teve que sobrecarregar o sumNumber()
método para fazê-lo funcionar com 3 argumentos.
E se o usuário quiser adicionar 5 números ou 10 ou 100?
Isso pode ser tratado de uma maneira simples com o uso de varargs. Vamos ver um exemplo de código:
Exemplo: Trabalho 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); ) )
Quando você executa o programa, a saída será:
comprimento do argumento: 2 soma2 = 6 comprimento do argumento: 3 soma3 = 9 comprimento do argumento: 4 soma4 = 16
Aqui, o sumNumber()
método retorna a soma dos int
parâmetros passados a ele (não importa o número de argumentos passados).
Como você pode ver, os varargs podem ser realmente úteis em algumas situações. No entanto, se você tiver certeza sobre o número de argumentos passados para um método, use a sobrecarga de método. Por exemplo, se você tiver certeza de que o sumNumber()
método será usado apenas para calcular a soma de 2 ou 3 argumentos, use a sobrecarga como no primeiro exemplo.
Vamos dar outro exemplo. O método format () definido na biblioteca Java aceita varargs. No JDK, o format()
método é definido da seguinte forma:
public static String format (Locale l, String format, Object … args) (// body)
Exemplo: 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 ) ); ) )
Quando você executa o programa, a saída será:
Nome do site: programiz.com, Emp Count: 6 Tipo: site do tutorial
Como varargs funciona nos bastidores?
Vamos considerar o seguinte pseudocódigo:
public int sumNumber (int… nums) (// corpo do método)
A …
sintaxe informa ao compilador Java que o método pode ser chamado com zero ou mais argumentos. Como resultado, a variável nums é declarada implicitamente como uma matriz do tipo int( )
. Assim, dentro do método, a variável nums é acessada usando a sintaxe de array.
No caso de não haver argumentos, o comprimento de nums é 0.
Sobrecarregando métodos Varargs
Semelhante aos métodos típicos, você pode sobrecarregar os métodos vararg.
Leitura recomendada: sobrecarga de método Java
Exemplo: Sobrecarga do 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"); ) )
Quando você executa o programa, a saída será:
soma = 6 negar = falso args.comprimento = 2
No programa acima, o test()
método é sobrecarregado pela alteração do número de argumentos que ele aceita.
Coisas para lembrar ao usar Varargs
Aqui estão algumas coisas que você deve se lembrar ao trabalhar com vargars Java:
1. Ao definir a assinatura do método, sempre mantenha varargs por último.
O argumento variável deve ser o último argumento passado para o método. Vamos considerar que você invocou um doSomething()
método como este:
doSomething (1, 2, 3, 4);
E, seu doSomething()
método é definido como:
// declaração de método incorreta public void doSomething (int… nums, int p) (// corpo do método)
Nesse caso, o compilador não consegue descobrir o número de argumentos passados para nums.
No entanto, se você definir seu método como:
public void doSomething (int p, int… nums) (// corpo do método)
O compilador Java atribui o primeiro argumento a p e os int
argumentos restantes são atribuídos a nums.
2. Um método pode ter apenas um parâmetro varargs.
Por exemplo, a declaração deste método está incorreta:
int doSomething (int p, float… floatNums, double… doubleNums) (// código)
Ambiguidade na sobrecarga do Método Varargs
Vamos considerar seu test()
método sobrecarregado como este:
class Demo (teste de vazio estático (int… vargs) (// corpo do método) teste de vazio estático (int n, int… vargs) (// corpo do método))
No programa acima, o compilador fica confuso se você tentar invocar o test()
método mesmo que os test()
métodos estejam sobrecarregados e aceitem um número diferente de argumentos.
O compilador não sabe qual método chamar. O compilador pode pensar, você está tentando chamar test(int… vargs)
com um argumento varargs. Além disso, o compilador pode pensar que você está tentando chamar test(int n, int… vargs)
com o argumento passado para o primeiro parâmetro com o segundo parâmetro vazio.
Como existem duas possibilidades, isso causa ambiguidade. Por causa disso, às vezes você pode precisar usar dois nomes de método diferentes em vez de sobrecarregar o método varargs.