Liste des paramètres de variable Java
La copie de code est la suivante:
classe A {}
Étant donné que toutes les classes sont héritées de l'objet, vous pouvez utiliser le tableau d'objets comme paramètre:
Paramètre de classe publique {static void printarRay (objet [] args) {for (objet obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (String [] args) {printArray (nouvel objet [] {new Integer (47), new float (3.14), nouveau double (11.11)}); printArray (nouvel objet [] {"un", "deux", "là"}); printArray (nouvel objet [] {new a (), new a (), new a ()}); }} Pour les versions Java SE5 après avoir ajouté des fonctionnalités, vous pouvez écrire ceci:
Paramètre de classe publique {public static void printarRay (objet ... args) {for (objet obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (String [] args) {printArray (nouvel entier (47), nouveau float (3.14), nouveau double (11.11)); printArray (47, 3.14f, 11.11); printarray ("un", "deux", "trois"); printArray (new a (), new a (), new a ()); printArray ((objet []) Nouveau entier [] {1, 2, 3, 4}); printArray (); }} Vous pouvez utiliser un objet pour penser à la liste des paramètres:
classe publique VarargType {static void f (caractère ... args) {System.out.print (args.getClass ()); System.out.println ("longueur" + args.length); } statique void g (int ... args) {System.out.print (args.getClass ()); System.out.println ("longueur" + args.length); } public static void main (String [] args) {f ('a'); f (); G (1); g (); System.out.println ("int []" + new int [0] .getClass ()); }}Il s'agit d'une fonctionnalité introduite dans Java 5. Si le nombre de paramètres qu'une méthode souhaite recevoir est incertain, cette fonctionnalité peut être utile.
Par exemple, où les opérations IO sont impliquées, vous devez essentiellement fermer au moins deux flux: entrée et sortie. J'aime encapsuler l'opération de fermeture du flux dans la méthode suivante, afin que plusieurs flux puissent être fermés en un seul appel.
public static void clarteSilent (closable ... closebles) {for (closable closable: closebles) {if (closable! = null) {try {closable.close (); } catch (ioException ignoré) {}}}}C'est le seul endroit où je pense que cette fonctionnalité convient à une utilisation, avec les fonctionnalités suivantes:
Ces paramètres ont le même type;
Le nombre de paramètres est incertain, chacun est facultatif;
Les utilisations de ces paramètres sont les mêmes, par exemple, ce qui précède est toutes la fermeture exécutée.
La liste des paramètres de longueur de variable Java ne peut être placée qu'à la fin de la liste des paramètres de la méthode.
Implémentation de la liste des paramètres de longueur variable Java
L'implémentation de la liste de paramètres de longueur de variable Java est passé par le compilateur pour encapsuler ces paramètres dans un tableau.
Par exemple, la signature de la méthode ci-dessus est réellement: closélent (clôture [] fermée) vide.
Marcher sur une fosse
Il existe une méthode qui est appelée par A et B à deux endroits. En septembre, un paramètre doit être ajouté à A. Lorsque mon esprit était fou, j'ai décidé d'utiliser une liste de paramètres de longueur variable. Je pensais qu'il n'y avait pas besoin de le changer en B, donc la fosse était enterrée.
Récemment, nous avons demandé à B d'ajouter deux nouveaux paramètres ici, nous continuons donc d'ajouter des paramètres à la liste des paramètres de la méthode. Les types de ces paramètres sont différents, de sorte que la liste des paramètres de longueur de variable est déclarée type d'objet.
La première fosse est que lors de la prise d'éléments avec des paramètres de longueur variable dans cette méthode, il ne tient pas compte du fait que certains paramètres ne sont pas passés et que le tableau est hors-jeu, l'exception est directement détruite. J'ai immédiatement senti que la liste des paramètres de longueur variable n'était pas bonne, donc je n'en avais pas besoin et je l'ai changée en un paramètre de forme fixe régulier.
Après la modification, il est bon de le tester dans l'environnement de test. Après avoir remplacé plusieurs classes dans l'environnement de production, le résultat est une erreur. La méthode ne peut être trouvée. Cela dépend de la signature de la méthode, mais c'est un tableau, et il n'a pas été remplacé. À en juger par le code source, l'emplacement d'appel n'a pas besoin d'être modifié, donc je ne m'attendais pas à le remplacer; Étant donné que l'environnement de test est entièrement emballé, il n'y aura aucun problème.
La signature de la méthode est déterminée au moment de la compilation. Le niveau de code source ne semble pas nécessiter une modification, mais ne signifie pas que la classe compilée n'a pas besoin d'être remplacée.
En fait, j'ai déjà entendu dire que dans ce cas de packages irréguliers, après avoir modifié une valeur constante dans le code source, seul le fichier de classe qui définit la constante est remplacé, et aucun recompilation et remplacement de tous les fichiers de classe qui référence à cette constante est possible, entraînant des problèmes inexplicables. C'est essentiellement le même problème que la signature de la méthode.