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;
}
Uso:
int result = sum(1, 2, 3); // Retorna 6
int emptyResult = sum(); // Retorna 0
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;
}
Uso:
int minValue = min(3, 1, 2); // Retorna 1
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;
}
Uso:
int minValue = min(3, 1, 2); // Retorna 1
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
}
Top comments (0)