O que significam os 3 pontos no método a seguir?
public void myMethod(String... strings){
// method body
}
fonte
O que significam os 3 pontos no método a seguir?
public void myMethod(String... strings){
// method body
}
Isso significa que zero ou mais objetos String (ou uma matriz deles) podem ser passados como argumento (s) para esse método.
Consulte a seção "Número arbitrário de argumentos" aqui: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
No seu exemplo, você pode chamá-lo como qualquer um dos seguintes:
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});
Nota importante: Os argumentos passados dessa maneira são sempre uma matriz - mesmo que exista apenas uma. Certifique-se de tratá-lo dessa maneira no corpo do método.
Nota importante 2: O argumento que obtém o ...
deve ser o último na assinatura do método. Então, myMethod(int i, String... strings)
está tudo bem, mas myMethod(String... strings, int i)
não está bem.
Agradecemos a Vash pelos esclarecimentos em seu comentário.
someMethod(new SomeType[] { })
. Isso seria um truque, não?Esse recurso é chamado varargs e é um recurso introduzido no Java 5. Isso significa que a função pode receber vários
String
argumentos:Em seguida, você pode usar o
String
var como uma matriz:Esta resposta empresta fortemente os de Kiswa e Lorenzo ... e também do comentário do Graphain.
fonte
É Varargs :)
O varargs abreviação de argumentos de tamanho variável é um recurso que permite que o método aceite número variável de argumentos (zero ou mais). Com varargs, tornou-se simples criar métodos que precisam receber um número variável de argumentos. O recurso de argumento variável foi adicionado no Java 5.
Sintaxe de varargs
Um vararg é seccionado por três reticências (três pontos) após o tipo de dados, sua forma geral é
Necessidade de varargs
Antes do Java 5, caso houvesse necessidade de número variável de argumentos, havia duas maneiras de lidar com isso
Se o número máximo de argumentos que um método pode assumir for pequeno e conhecido, poderão ser criadas versões sobrecarregadas do método. Se o número máximo de argumentos que um método poderia levar era grande ou desconhecido e, em seguida, a abordagem era colocar esses argumentos em uma matriz e passá-los para um método que toma a matriz como parâmetro. Essas duas abordagens eram propensas a erros - construindo sempre uma matriz de parâmetros e difíceis de manter -, pois a adição de novos argumentos pode resultar na escrita de um novo método sobrecarregado.
Vantagens de varargs
Oferece uma opção muito mais simples. Menos código, pois não é necessário escrever métodos sobrecarregados.
Exemplo de varargs
Pode ser visto no programa que o comprimento é usado aqui para encontrar o número de argumentos passados para o método. É possível porque os varargs são passados implicitamente como uma matriz. Quaisquer que sejam os argumentos passados como varargs, são armazenados em uma matriz que é referida pelo nome dado a varargs. Nesse programa, o nome da matriz é valores. Observe também que o método é chamado com número diferente de argumentos, primeira chamada com quatro argumentos, depois três argumentos e depois com zero argumentos. Todas essas chamadas são tratadas pelo mesmo método que leva varargs.
Restrição com varargs
É possível ter outros parâmetros com o parâmetro varargs em um método, no entanto, nesse caso, o parâmetro varargs deve ser o último parâmetro declarado pelo método.
Outra restrição com varargs é que deve haver apenas um parâmetro varargs.
Sobrecarregando varargs Métodos
É possível sobrecarregar um método que aceita o parâmetro varargs. O método Varargs pode ser sobrecarregado por -
Os tipos de seu parâmetro vararg podem ser diferentes. Adicionando outros parâmetros. Exemplo de sobrecarga do método varargs
Varargs e ambiguidade de sobrecarga
Em alguns casos, a chamada pode ser ambígua enquanto sobrecarregamos o método varargs. Vamos ver um exemplo
Neste programa, quando fazemos uma chamada para o método displayData () sem nenhum parâmetro, ele gera erro, porque o compilador não tem certeza se essa chamada de método é para
displayData(String ... values)
oudisplayData(int ... values)
Da mesma forma, se sobrecarregamos métodos em que um tem o
vararg
método de um tipo e outro método tem um parâmetro evararg
parâmetro do mesmo tipo, também temos a ambiguidade - As Exp -displayData(int ... values)
edisplayData(int a, int ... values)
Esses dois métodos sobrecarregados sempre terão ambiguidade.
fonte
Esta é a maneira Java de passar varargs (argumentos de número variável).
Se você conhece C, isso é semelhante à
...
sintaxe usada naprintf
função:mas de uma maneira segura: todo argumento deve estar em conformidade com o tipo especificado (na sua amostra, eles devem ser todos
String
).Este é um exemplo simples de como você pode usar varargs :
O
...
argumento é na verdade uma matriz, então você pode passar umString[]
como parâmetro.fonte
Indiscutivelmente, é um exemplo de açúcar sintático, já que é implementado como uma matriz de qualquer maneira (o que não significa que seja inútil) - eu prefiro passar uma matriz para mantê-la clara e também declarar métodos com matrizes de determinado tipo. Antes, uma opinião do que uma resposta.
fonte
Também para esclarecer algumas coisas, é importante saber que os parâmetros var-arg são limitados a um e você não pode ter vários parâmetros de var-art. Por exemplo, isso é ilegal:
fonte
Pense nisso como a palavra-chave
params
em C #, se você vier desse plano de fundo :)fonte
Uma maneira realmente comum de ver um exemplo claro do uso dos três pontos está presente em um dos métodos mais famosos do Android AsyncTask (que hoje não é muito usado por causa do RXJAVA, sem mencionar os componentes da arquitetura do Google), você pode encontrar milhares de exemplos pesquisando esse termo, e a melhor maneira de entender e nunca mais esquecer o significado dos três pontos é que eles expressam uma ... dúvida ... como no idioma comum. Ou seja, não está claro o número de parâmetros que precisam ser passados, pode ser 0, pode ser 1, pode ser mais (uma matriz) ...
fonte
String...
é o mesmo queString[]
fonte
String...
é o mesmo queString[]
, você não poderia simplesmente dizer isso?String[]
requer um argumento (pelo menos uma matriz vazia)String...
e não (veja a resposta acima).Adicionando outras respostas bem escritas, uma vantagem
varagrs
que achei útil é que, quando chamo um método com matriz como um tipo de parâmetro, elimina a necessidade de criar uma matriz; adicione elementos e depois envie-o. Em vez disso, posso simplesmente chamar o método com quantos valores quiser; de zero a muitos.fonte
Exemplo 1:
Exemplo 2:
fonte
Sintaxe: (ponto triplo ...) -> significa que podemos adicionar zero ou mais objetos a passar em argumentos ou passar uma matriz do tipo objeto.
Definição: 1) O argumento Objeto ... é apenas uma referência a uma matriz de Objetos.
2) ('String []' ou String ...) É capaz de lidar com qualquer número de objetos de string. Internamente, ele usa uma matriz de objeto do tipo de referência.
3) Se você quiser chamar o método com um único argumento e ele for uma matriz, será necessário envolvê-lo explicitamente
Aplicação: É usado principalmente quando o número de argumentos é dinâmico (número de argumentos conhecidos em tempo de execução) e sobrescrevendo. Regra geral - No método, podemos passar qualquer tipo e qualquer número de argumentos. Não podemos adicionar argumentos de objeto (...) antes de argumentos específicos. ie
fonte