Trabalhando com Varargs
Como você viu no capítulo anterior, um método pode usar um parâmetro vararg (argumento variável como se fosse uma matriz. É um pouco diferente de uma matriz, no entanto. Um parâmetro vararg deve ser o último elemento na lista de parâmetros de um método. Isso implica que você só tem permissão para ter um parâmetro vararg por método. Você consegue identificar por que cada um deles compila ou não? (Sim, há muitas prática neste capítulo. Você precisa ser muito bom em identificar métodos válidos e inválidos para o exame.)
public void walk1(int... nums) { }
public void walk2(int start, int... nums) { }
public void walk3(int... nums, int start) { } // DOES NOT COMPILE
public void walk4(int... start, int... nums) { } // DOES NOT COMPILE
walk1 () é uma declaração de método válida com um parâmetro vararg.
walk2 () é uma declaração válido de método com um parâmetro int e um parâmetro vararg.
walk3 () ewalk4 () não compila porque possui um parâmetro vararg em uma posição que não é a última. Ao chamar um método com um parâmetro vararg, você tem uma opção. Você pode passar um ou você pode listar os elementos da matriz e permitir que o Java crie para você. Você também pode omitir os valores vararg na chamada do método e o Java criará uma matriz de comprimento zero para você. Finalmente! Temos que fazer algo diferente de identificar se as declarações de método são válido. Em vez disso, examinamos as chamadas de método. Você pode descobrir por que cada método chamado coloca o que faz?
15: public static void walk(int start, int... nums) {
16: System.out.println(nums.length);
17: }
18: public static void main(String[] args) {
19: walk(1); // 0
20: walk(1, 2); // 1
21: walk(1, 2, 3); // 2
22: walk(1, new int[] {4, 5}); // 2
23: }
A linha 19 passa 1 como início, mas nada mais. Isso significa que o Java cria uma matriz de comprimento 0 para nums . A linha 20 passa 1 como início e mais um valor. Java converte esse valor em uma matriz decomprimento 1. A linha 21 passa 1 como início e mais dois valores. Java converte esses dois valores em ummatriz de comprimento 2. A linha 22 passa 1 como início e uma matriz de comprimento 2 diretamente como nums .Você viu que o Java criará uma matriz vazia se nenhum parâmetro for passado para umvararg. No entanto, ainda é possível passar nulo explicitamente:
walk(1, null); // throws a NullPointerException
Como null não é um int , Java o trata como uma referência de matriz que passa a ser nula . isto apenas passa o objeto de matriz nula para walk. Então o método walk () lança uma exceção porque tenta determinar o comprimento de null. Acessar um parâmetro vararg também é como acessar um array. Ele usa indexação de matriz. Por exemplo:
16: public static void run(int... nums) {
17: System.out.println(nums[1]);
18: }
19: public static void main(String[] args) {
20: run(11, 22); // 22
21: }
A linha 20 chama um parâmetro vararg de dois parâmetros. Quando o método é chamado, ele vê uma matriz de tamanho 2. Como os índices são baseados em 0, 22 é impresso.