Liste des paramètres des variables Java
class A {}
Étant donné que toutes les classes héritent d'Object, les méthodes qui peuvent prendre des tableaux Object comme paramètres :
public class parameter { static void printArray(Object[] args){ for(Object obj : args){ System.out.print(obj + " "); } System.out.println(); } public static void main(String[] args){ printArray(new Object[] { new Integer(47), new Float(3.14), new Double(11.11) }); printArray(new Object[]{"one", "two", "there"}); printArray(new Object[]{new A(), new A(), new A()}); } }
Pour Java SE5 et les versions ultérieures, les fonctionnalités ajoutées peuvent être écrites comme ceci :
public class parameter { public static void printArray(Object... args){ for(Object obj : args){ System.out.print(obj + " "); } System.out.println(); } public static void main(String[] args){ printArray(new Integer(47), new Float(3.14), new Double(11.11)); printArray(47, 3.14F, 11.11); printArray("one", "two", "three"); printArray(new A(), new A(), new A()); printArray((Object[]) new Integer[]{1, 2, 3, 4}); printArray(); } }
Vous pouvez utiliser la liste de paramètres d'Object :
public class VarargType{ static void f(Character... args){ System.out.print(args.getClass()); System.out.println(" length " + args.length); } static void g(int... args){ System.out.print(args.getClass()); System.out.println(" length " + 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 à recevoir par une méthode est incertain, alors cette fonctionnalité peut s'avérer utile. Par exemple, lorsque des opérations d'E/S sont impliquées, au moins deux flux doivent être fermés : l'entrée et la sortie. J'aime encapsuler l'opération de fermeture du flux dans la méthode suivante, afin que plusieurs flux puissent être fermés avec juste. un appel. Un flux.
public static void closeSilent(Closeable... closeables) { for (Closeable closeable : closeables) { if (closeable != null) { try { closeable.close(); } catch (IOException ignored) { } } } }C'est le seul endroit où je pense que cette fonctionnalité peut être utilisée, avec les caractéristiques suivantes : Ces paramètres ont le même type Nombre de paramètres Je ne suis pas sûr, chacun est facultatif ;
Le but de ces paramètres est le même, par exemple, ceux ci-dessus sont tous des arrêts d'exécution.
La liste des paramètres Java de longueur variable ne peut être placée qu'à la fin de la liste des paramètres de la méthode.
L'implémentation de la liste de paramètres Java de longueur variable consiste à encapsuler ces paramètres dans un tableau et à les transmettre via le compilateur.
Par exemple, la signature de la méthode ci-dessus est en fait : closeSilent(Closeable[] closeables) void .
Entrez dans le piège
Il existe une méthode qui s'appelle à deux endroits A et B. En septembre, j'avais besoin d'ajouter un paramètre en A. À ce moment-là, mon cerveau est devenu fou et j'ai décidé d'utiliser Concernant la liste des paramètres de longueur variable, j'ai pensé que ce serait plus simple sans changer B, donc la fosse a été enterrée.
Récemment, B doit ajouter deux nouveaux paramètres ici. Continuez ensuite à ajouter des paramètres à la liste des paramètres de la méthode. Les types de ces paramètres sont différents, donc la liste des paramètres de longueur variable est déclarée comme type d'objet. .
Le premier écueil est que lors de la récupération d'éléments de paramètres de longueur variable dans cette méthode, il n'est pas considéré que certains paramètres ne sont pas transmis et une exception de hors-jeu du tableau est directement provoquée. Immédiatement, j'ai 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 modifiée en passant des paramètres de forme fixe réguliers.
Après la modification, cela n'a posé aucun problème lors du test dans l'environnement de test. Après avoir remplacé plusieurs classes dans l'environnement de production, une erreur a été signalée et la méthode est introuvable. Lorsque j'ai regardé la signature de la méthode, il s'agissait toujours d'un tableau et elle n'a pas été remplacée. À en juger par le code source, le lieu d'appel n'a pas besoin d'être modifié, donc je ne m'attendais pas à le remplacer puisque l'environnement de test est entièrement packagé, il n'y aura aucun problème ;
La signature de la méthode est déterminée lors de la compilation. Si elle n'a pas besoin d'être modifiée au niveau du code source, cela ne veut pas dire 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 contrat irrégulier, après avoir modifié une valeur constante dans le code source, seul le fichier de classe qui définit la constante est remplacé sans toutes les références à la constante. les fichiers sont recompilés et remplacés, provoquant des problèmes inexplicables. C'est essentiellement le même problème que la situation de signature de méthode.
Pour plus d'articles sur l'analyse de la liste des paramètres de longueur variable de Java et les points à noter lors de son utilisation, veuillez prêter attention au site Web PHP chinois !