Pergunta

Eu tenho medo de varargs. Eu não sei o que usar para eles.

Além disso, ele se sente perigoso deixar as pessoas passar tantos argumentos como eles querem.

O que é um exemplo de um contexto que seria um bom lugar para usá-los?

Foi útil?

Solução

VarArgs útil para qualquer método que precisa lidar com um número indeterminado de objetos . Um exemplo bom é String.format . A string de formato pode aceitar qualquer número de parâmetros, então você precisa de um mecanismo para passar em qualquer número de objetos.

String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);

Outras dicas

Uma boa regra de ouro seria:

"Utilização varargs por qualquer método (ou construtor) que necessita de uma gama de T (independentemente do tipo T pode ser) como entrada".

Isso vai fazer chamadas para estes métodos mais fácil (não há necessidade de fazer new T[]{...}).

Você poderia estender esta regra para incluir métodos com um argumento List<T>, desde que este argumento é apenas para entrada (ou seja, a lista não é modificado pelo método).

Além disso, gostaria de se abster de utilizar f(Object... args) porque seus deslizes em direção a um caminho de programação com APIs incerto.

Em termos de exemplos, eu tê-lo usado na DesignGridLayout , onde posso adicionar vários JComponents em uma chamada :

layout.row().grid(new JLabel("Label")).add(field1, field2, field3);

No código acima o método add () é definido como add(JComponent... components).

Finalmente, a implementação de tais métodos devem cuidar do fato de que ele pode ser chamado com um vararg vazio! Se você quiser impor pelo menos um argumento, então você tem que usar um truque feio, tais como:

void f(T arg1, T... args) {...}

Eu considero este truque feio, porque a implementação do método será menos simples do que ter apenas T... args em sua lista de argumentos.

Espera que isso ajuda a esclarecer o ponto sobre varargs.

Eu uso varargs com freqüência para a saída para os logs para fins de depuração.

Praticamente todas as classes em meu aplicativo tem um debugPrint método ():

private void debugPrint(Object... msg) {
    for (Object item : msg) System.out.print(item);
    System.out.println();
}

Então, dentro de métodos da classe, eu tenho chamadas como o seguinte:

debugPrint("for assignment ", hwId, ", student ", studentId, ", question ",
    serialNo, ", the grade is ", grade);

Quando eu estou satisfeito que meu código está funcionando, eu comentar o código no debugPrint () método para que os logs não irá conter informações muito estranha e indesejada, mas pode deixar as chamadas individuais para debugPrint () comentada. Mais tarde, se eu encontrar um bug, eu apenas uncomment o código () debugPrint, e todas as minhas chamadas para debugPrint () são reativados.

Claro, eu poderia facilmente eschew varargs e faça o seguinte em vez disso:

private void debugPrint(String msg) {
    System.out.println(msg);
}

debugPrint("for assignment " + hwId + ", student " + studentId + ", question "
    + serialNo + ", the grade is " + grade);

No entanto, neste caso, quando eu comentar o código debugPrint (), o servidor ainda tem que passar pela dificuldade de concatenar todas as variáveis ??em cada chamada para debugPrint (), mesmo que nada é feito com a cadeia resultante . Se eu usar varargs, no entanto, o servidor só tem que colocá-los em uma matriz antes que ele percebe que não precisa delas. Muito tempo é salvo.

VarArgs pode ser usado quando não temos certeza sobre o número de argumentos a serem passados ??em um método. Ela cria uma série de parâmetros de comprimento indeterminado no fundo e um tal parâmetro pode ser tratada como uma matriz no tempo de execução.

Se tivermos um método que é sobrecarregado para aceitar um número diferente de parâmetros, então em vez de sobrecarregar o método momentos diferentes, podemos simplesmente usar varargs conceito.

Além disso, quando tipo dos parâmetros vai variar em seguida, usando 'Objeto ... test' vai simplificar o código muito.

Por exemplo:

public int calculate(int...list) {
    int sum = 0;
    for (int item : list) {
        sum += item;
    }
    return sum;
}

Aqui indiretamente uma matriz do tipo int (lista) é passado como parâmetro e é tratado como uma matriz no código.

Para uma melhor compreensão, siga este link (isso me ajudou muito na compreensão deste conceito claramente): http://www.javadb.com/using-varargs-in-java

P.S: Mesmo que eu estava com medo de usar varargs quando eu não knw abt-lo. Mas agora eu estou acostumado com isso. Como se diz: "Nós nos apegamos ao conhecido, com medo do desconhecido", então, basta usá-lo tanto quanto você pode e você também vai começar a gostar dele:)

VarArgs é a característica adicional em java versão 1.5.

Por que usar isso?

  1. O que se, você não sabe o número de argumentos para passar para um método?
  2. E se você quer passar um número ilimitado de argumentos para um método?

Como isso funciona?

cria uma matriz com os argumentos fornecidos & passa a matriz para o método.

Exemplo:

public class Solution {



    public static void main(String[] args) {
        add(5,7);
        add(5,7,9);
    }

    public static void add(int... s){
        System.out.println(s.length);
        int sum=0;
        for(int num:s)
            sum=sum+num;
        System.out.println("sum is "+sum );
    }

}

Output:

2

soma é 12

3

soma é 21

Eu tenho um varargs relacionada com o medo, também:

Se o chamador passa em uma matriz explícita para o método (ao contrário de vários parâmetros), você vai receber uma referência compartilhada para essa matriz.

Se você precisa armazenar essa matriz internamente, você pode querer cloná-lo primeiro para evitar o chamador ser capaz de mudá-lo mais tarde.

 Object[] args = new Object[] { 1, 2, 3} ;

 varArgMethod(args);  // not varArgMethod(1,2,3);

 args[2] = "something else";  // this could have unexpected side-effects

Enquanto isso não é realmente diferente de passar em qualquer tipo de objeto cujo estado pode mudar mais tarde, uma vez que a matriz é normalmente (no caso de uma chamada com vários argumentos em vez de um array) um fresco criado pelo compilador internamente que você pode usar com segurança, este é certamente um comportamento inesperado.

Eu uso varargs freqüentemente para construtores que pode tomar algum tipo de objeto de filtro. Por exemplo, uma grande parte do nosso sistema baseado em Hadoop é baseado em um mapeador que lida com a serialização e desserialização de itens para JSON, e aplica-se um número de processadores que cada tomar um item de conteúdo e quer modificar e devolvê-lo, ou nulos retorno a rejeitar.

Em Java doc da VAR-Args é bastante claro o uso de argumentos var:

http://docs.oracle.com/ JavaSE / 1.5.0 / docs / guia / language / varargs.html

sobre o uso que diz:

"Então, quando você deve usar varargs? Como cliente, você deve aproveitá-las sempre que a API lhes oferece. usos importantes APIs núcleo incluem reflexão, formatação de mensagens, e as novas instalações printf. Como um designer de API, você deve usá-los com moderação, apenas quando o benefício é verdadeiramente convincente. De um modo geral, você não deve sobrecarregar um método varargs, ou ele vai ser difícil para os programadores de descobrir qual sobrecarga é chamado. "

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