Item 53: Use os varargs com sabedoria

Java Efetivo (livro) - Sep 12 - - Dev Community

Métodos varargs permitem aceitar zero ou mais argumentos de um tipo específico.

O método cria um array com o número de argumentos passados e os insere nesse array.
Exemplo: sum(1, 2, 3) retorna 6, e sum() retorna 0.

Problemas com métodos varargs sem restrições:
Falhas em tempo de execução se nenhum argumento for passado.
Verificações de validade explícitas são necessárias, o que torna o código feio.

Solução:
Use varargs em conjunto com parâmetros normais obrigatórios para garantir a presença de pelo menos um argumento.
Cuidado com o desempenho: Cada invocação de varargs cria um array, o que pode impactar o desempenho em situações críticas.

Padrão para melhorar desempenho:
Use sobrecargas de métodos para quantidades pequenas de parâmetros (ex.: de zero a três) e varargs para casos com mais parâmetros.

Exemplo de uso prático:
As static factories de EnumSet usam essa técnica para otimizar o desempenho.

Conclusão:
Varargs são úteis para métodos com número variável de argumentos, mas devem ser usados com cuidado para evitar impactos no desempenho.

Aqui estão os exemplos de código mencionados no Item 53

  • Método varargs que soma uma sequência de inteiros:
public static int sum(int... args) {
    int sum = 0;
    for (int arg : args) {
        sum += arg;
    }
    return sum;
}

Enter fullscreen mode Exit fullscreen mode

Uso:

int result = sum(1, 2, 3);  // Retorna 6
int emptyResult = sum();     // Retorna 0

Enter fullscreen mode Exit fullscreen mode

Exigindo ao menos um argumento (exemplo com cálculo do mínimo):
Solução com verificação manual (não recomendada):

public static int min(int... args) {
    if (args.length == 0) {
        throw new IllegalArgumentException("Argumentos ausentes.");
    }
    int min = args[0];
    for (int i = 1; i < args.length; i++) {
        if (args[i] < min) {
            min = args[i];
        }
    }
    return min;
}

Enter fullscreen mode Exit fullscreen mode

Uso:

int minValue = min(3, 1, 2);  // Retorna 1

Enter fullscreen mode Exit fullscreen mode

Solução recomendada (parâmetro normal + varargs):

public static int min(int firstArg, int... remainingArgs) {
    int min = firstArg;
    for (int arg : remainingArgs) {
        if (arg < min) {
            min = arg;
        }
    }
    return min;
}

Enter fullscreen mode Exit fullscreen mode

Uso:

int minValue = min(3, 1, 2);  // Retorna 1

Enter fullscreen mode Exit fullscreen mode

Sobrecargas para otimizar o uso de varargs:

public static void exampleMethod() {
    // Sobrecarga para 1 argumento
}

public static void exampleMethod(int a1) {
    // Sobrecarga para 1 argumento
}

public static void exampleMethod(int a1, int a2) {
    // Sobrecarga para 2 argumentos
}

public static void exampleMethod(int a1, int a2, int a3) {
    // Sobrecarga para 3 argumentos
}

public static void exampleMethod(int a1, int a2, int a3, int... more) {
    // Usa varargs para 4 ou mais argumentos
}

Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player