Lista de parâmetros variáveis Java
A cópia do código é a seguinte:
classe A {}
Como todas as classes são herdadas do objeto, você pode usar a matriz de objetos como um parâmetro:
classe pública parâmetro {estático void printArray (objeto [] args) {for (objeto obj: args) {system.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {PrintArray (novo objeto [] {new Integer (47), novo float (3.14), novo duplo (11.11)}); PrintArray (novo objeto [] {"One", "Two", "lá"}); PrintArray (novo objeto [] {novo a (), novo a (), novo a ()}); }} Para as versões Java SE5 após adicionar recursos, você pode escrever isso:
classe pública Parâmetro {public static void PrintArray (objeto ... args) {for (objeto obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {PrintArray (new Integer (47), New Float (3.14), novo duplo (11.11)); PrintArray (47, 3.14F, 11.11); PrintArray ("One", "Two", "Three"); PrintArray (novo a (), novo a (), novo a ()); PrintArray ((objeto []) new Integer [] {1, 2, 3, 4}); PrintArray (); }} Você pode usar o objeto para pensar na lista de parâmetros:
public System.out.println ("comprimento" + args.length); } estático void g (int ... args) {System.out.print (args.getclass ()); System.out.println ("comprimento" + args.length); } public static void main (string [] args) {f ('a'); f (); g (1); g (); System.out.println ("int []" + novo int [0] .getclass ()); }}Este é um recurso introduzido no Java 5. Se o número de parâmetros que um método deseja receber for incerto, esse recurso poderá ser útil.
Por exemplo, onde as operações de IO estão envolvidas, você basicamente precisa fechar pelo menos dois fluxos: entrada e saída. Gosto de encapsular a operação de fechamento do fluxo no método a seguir, para que vários fluxos possam ser fechados em apenas uma chamada.
public static void Closesilent (fechado ... fechado) {for (fechado fechado: fechables) {if (fechando! = null) {try {closeable.close (); } catch (ioexception ignorado) {}}}}Este é o único lugar que acho que esse recurso é adequado para uso, com os seguintes recursos:
Esses parâmetros têm o mesmo tipo;
O número de parâmetros é incerto, cada um é opcional;
Os usos desses parâmetros são os mesmos, por exemplo, os acima são executados de fechamento.
A lista de parâmetros Java variável de comprimento variável pode ser colocada apenas no final da lista de parâmetros do método.
Implementação da lista de parâmetros de comprimento de variável Java
A implementação da lista de parâmetros de comprimento de variável Java é passada através do compilador para encapsular esses parâmetros em uma matriz.
Por exemplo, a assinatura do método acima é realmente: Closesilent (fechado [] fechado) vazio.
Pisar em um poço
Existe um método chamado por A e B em dois lugares. Em setembro, um parâmetro precisa ser adicionado a A. Quando minha mente estava louca, decidi usar uma lista de parâmetros de comprimento variável. Eu senti que não havia necessidade de alterá -lo para B, então o poço foi enterrado.
Recentemente, pedimos ao B para adicionar dois novos parâmetros aqui, por isso continuamos a adicionar parâmetros à lista de parâmetros do método. Os tipos desses parâmetros são diferentes; portanto, a lista de parâmetros de comprimento de variável é declarada como tipo de objeto.
O primeiro poço é que, ao levar elementos com parâmetros de comprimento variável nesse método, ele não leva em consideração que alguns parâmetros não são passados e a matriz é uma exceção de impedimento é destruída diretamente. Eu imediatamente senti que a lista de parâmetros de comprimento variável não era boa, então não precisava e mudei para uma passagem regular de parâmetros de forma fixa.
Após a modificação, é bom testá -lo no ambiente de teste. Depois de substituir várias classes no ambiente de produção, o resultado é um erro. O método não pode ser encontrado. Depende da assinatura do método, mas é uma matriz e não foi substituída. A julgar pelo código -fonte, o local da chamada não precisa ser alterado, então eu não esperava substituí -lo; Como o ambiente de teste está totalmente embalado, não haverá problemas.
A assinatura do método é determinada no momento da compilação. O nível do código -fonte não parece exigir modificação, mas não significa que a classe compilada não precisa ser substituída.
De fato, ouvi antes que, neste caso de pacotes irregulares, depois de alterar um valor constante no código -fonte, apenas o arquivo de classe que define a constante é substituído e sem recompilar e substituir todos os arquivos de classe que referenciam essa constante é possível, resultando em problemas inexplicáveis. É essencialmente o mesmo problema que a assinatura do método.