Pergunta

Considere as assinaturas seguinte método:

public fooMethod (Foo[] foos) { /*...*/ }

e

public fooMethod (Foo... foos) { /*...*/ }

Explicação: O primeiro usa uma matriz de Foo-objetos como um argumento - fooMethod(new Foo[]{..}) - enquanto o segundo leva uma quantidade arbitrária de argumentos do tipo Foo, e apresenta-los como uma matriz de Foo: é dentro do método - fooMethod(fooObject1, fooObject2, etc...).

Java joga um ajuste, se ambos estiverem definidos, alegando que eles são métodos duplicados. Eu fiz algum trabalho de detetive, e descobriu que a primeira declaração realmente requer uma matriz explícita de Foo objetos, e essa é a única maneira de chamar esse método. A segunda maneira realmente aceita tanto uma quantidade arbitrária de argumentos Foo e também aceita uma matriz de Foo objetos.

Assim, a pergunta é, desde o último método parece mais flexível, existem razões para usar o primeiro exemplo, ou eu perdi alguma coisa vital?

Foi útil?

Solução

Estes métodos são realmente o mesmo.

Este recurso é chamado varargs e é uma característica do compilador. Nos bastidores é se traduz a versão anterior.

Não é uma armadilha se você definir um método que aceita Objeto ... e você enviou um parâmetro do tipo Object []!

Outras dicas

Eu gostaria de acrescentar a explicação de Shimi de acrescentar que outra restrição do varargs sintaxe é que o vararg deve ser o último parâmetro declarado. Então você não pode fazer isso:

void myMethod(String... values, int num);

Isto significa que qualquer método dado só pode ter um único parâmetro vararg. Nos casos em que você deseja passar várias matrizes, você pode usar varargs por apenas um deles.

Na prática, varargs estão no seu melhor quando você está tratando os argumentos como um número arbitrário de valores distintos, em vez de como uma matriz. Java5 os mapeia para uma matriz simplesmente porque essa era a coisa mais conveniente para fazer.

Um exemplo bom é String.format (). Aqui, os varargs são comparados com os espaços reservados de formato no primeiro argumento.

O último foi introduzido em Java 5 e bibliotecas existentes estão gradualmente sendo reformulado para apoiá-lo. Você ainda pode usar o antigo ao estresse que o método exige 2+ entradas, e existem restrições sobre onde o ... pode ser usado.

Há certamente há problemas de desempenho ou coisas desse tipo a considerar, por isso se resume a semântica.

Você espera que o chamador do seu método para ter uma matriz de Foo está pronto na mão? Em seguida, use a versão Foo []. Use a variante varargs para enfatizar a possibilidade de ter um "bando" de Foo de vez de uma matriz.

Um exemplo clássico para varargs ist a string de formato (em C #, não sei como o seu chamado em Java):

string Format(string formatString, object... args)

Aqui você espera que os argumentos para ser de diferentes tipos, assim que ter uma matriz de argumentos seria bastante unusal, daí a variante varargs.

Por outro lado em algo como

string Join(string[] substrings, char concatenationCharacter)

usando um Array é perfeitamente razoável.

Além disso, note que você pode ter vários matriz parâmetros e apenas um vararg parâmetro no final da lista de paramater.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top