Java Varargs (argumentos variáveis) com exemplos

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 intparâ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 intargumentos 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.

Artigos interessantes...