Lista de parámetros variables de Java
La copia del código es la siguiente:
Clase A {}
Dado que todas las clases se heredan de Object, puede usar la matriz de objetos como parámetro:
Parámetro de clase pública {static void printArray (objeto [] args) {para (object obj: args) {system.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {printArray (nuevo objeto [] {nuevo entero (47), new Float (3.14), new Double (11.11)}); printArray (nuevo objeto [] {"one", "dos", "allí"}); printArray (nuevo objeto [] {nuevo A (), nuevo A (), nuevo A ()}); }} Para las versiones Java SE5 después de agregar funciones, puede escribir esto:
Parámetro de clase pública {public static void printArray (objeto ... args) {para (object obj: args) {system.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {printArray (nuevo entero (47), new float (3.14), new double (11.11)); printArray (47, 3.14f, 11.11); printArray ("uno", "dos", "tres"); printArray (nuevo A (), nuevo A (), nuevo A ()); printArray ((objeto []) nuevo entero [] {1, 2, 3, 4}); printArray (); }} Puede usar objeto para pensar en la lista de parámetros:
public class varargType {static void f (carácter ... args) {system.out.print (args.getClass ()); System.out.println ("longitud" + args.length); } static void g (int ... args) {system.out.print (args.getClass ()); System.out.println ("longitud" + args.length); } public static void main (string [] args) {f ('a'); F(); g (1); gramo(); System.out.println ("int []" + nuevo int [0] .getClass ()); }}Esta es una característica introducida en Java 5. Si el número de parámetros que un método quiere recibir es incierto, entonces esta característica puede ser útil.
Por ejemplo, donde están involucradas las operaciones de IO, básicamente necesita cerrar al menos dos flujos: entrada y salida. Me gusta encapsular la operación de cierre de la corriente en el siguiente método, para que se puedan cerrar múltiples transmisiones en una sola llamada.
Public static void cierre (cierre ... cierreos) {para (cerrable cerrable: cierre) {if (cerrable! = null) {try {cerrable.close (); } catch (ioException ignorado) {}}}}Este es el único lugar que creo que esta característica es adecuada para su uso, con las siguientes características:
Estos parámetros tienen el mismo tipo;
El número de parámetros es incierto, cada uno es opcional;
Los usos de estos parámetros son los mismos, por ejemplo, los anteriores se ejecutan de cierre.
La lista de parámetros de longitud variable Java solo se puede colocar al final de la lista de parámetros del método.
Implementación de la lista de parámetros de longitud variable Java
La implementación de la lista de parámetros de longitud variable Java se pasa a través del compilador para encapsular estos parámetros en una matriz.
Por ejemplo, la firma del método anterior es en realidad: cierre (cierre [] cierre [] cierre) nulo.
Pisar un pozo
Hay un método llamado por A y B en dos lugares. En septiembre, se debe agregar un parámetro a A. Cuando mi mente estaba loca, decidí usar una lista de parámetros de longitud variable. Sentí que no había necesidad de cambiarlo a B, por lo que el pozo estaba enterrado.
Recientemente, hemos pedido a B que agregue dos nuevos parámetros aquí, por lo que continuamos agregando parámetros a la lista de parámetros del método. Los tipos de estos parámetros son diferentes, por lo que la lista de parámetros de longitud variable se declara como tipo de objeto.
El primer pozo es que al tomar elementos con parámetros de longitud variable en este método, no tiene en cuenta que algunos parámetros no se pasan, y la matriz es la excepción de fuera de juego se destruye directamente. Inmediatamente sentí que la lista de parámetros de longitud variable no era buena, por lo que no la necesitaba y la cambié a un parámetro de forma fija regular.
Después de la modificación, está bien probarlo en el entorno de prueba. Después de reemplazar varias clases en el entorno de producción, el resultado es un error. El método no se puede encontrar. Depende de la firma del método, pero es una matriz y no ha sido reemplazado. A juzgar por el código fuente, la ubicación de la llamada no necesita cambiarse, por lo que no esperaba reemplazarlo; Dado que el entorno de prueba está completamente empaquetado, no habrá problemas.
La firma del método se determina en el momento de la compilación. El nivel del código fuente no parece requerir modificación, pero no significa que la clase compilada no sea necesario reemplazarse.
De hecho, he escuchado antes que en este caso de paquetes irregulares, después de cambiar un valor constante en el código fuente, solo el archivo de clase que define la constante se reemplaza y no se reemplaza la recompensa y reemplazar todos los archivos de clase que hacen referencia a esta constante es posible, lo que resulta en problemas inexplicables. Es esencialmente el mismo problema que la firma del método.