Java-Variablenparameterliste
class A {}
Da alle Klassen von Object erben, können Methoden, die Object-Arrays als Parameter annehmen können:
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()}); } }
Für Java SE5 und spätere Versionen können hinzugefügte Funktionen wie folgt geschrieben werden:
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(); } }
Sie können die Parameterliste von Objekt verwenden:
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()); } }
public static void closeSilent(Closeable... closeables) { for (Closeable closeable : closeables) { if (closeable != null) { try { closeable.close(); } catch (IOException ignored) { } } } }
Der Zweck dieser Parameter ist derselbe, zum Beispiel sind die oben genannten alle Ausführungsabschaltungen.
Java-Parameterlisten variabler Länge können nur am Ende der Methodenparameterliste platziert werden.
Die Implementierung der Java-Parameterliste variabler Länge wird vom Compiler übergeben, indem diese Parameter in ein Array gekapselt werden.
Zum Beispiel lautet die Signatur der oben genannten Methode tatsächlich: closeSilent(Closeable[] closeables) void .
Betreten Sie die Grube
Es gibt eine Methode, die von zwei Stellen A und B aufgerufen wird. Im September musste ich bei A einen Parameter hinzufügen. Damals spielte mein Gehirn verrückt und ich entschied mich für die Verwendung In Bezug auf die Parameterliste mit variabler Länge dachte ich, es wäre einfacher, ohne den Parameter B zu ändern, also wurde die Falle begraben.
Vor Kurzem muss B hier zwei neue Parameter hinzufügen. Anschließend werden weitere Parameter zur Parameterliste der Methode hinzugefügt, sodass die Parameterliste mit variabler Länge als Objekttyp deklariert wird .
Die erste Gefahr besteht darin, dass beim Abrufen von Elementen von Parametern variabler Länge in dieser Methode nicht berücksichtigt wird, dass einige Parameter nicht übergeben werden, und direkt eine Array-Offside-Ausnahme verursacht wird. Ich hatte sofort das Gefühl, dass die Parameterliste mit variabler Länge nicht gut war, also brauchte ich sie nicht und änderte sie auf die reguläre Parameterübergabe in fester Form.
Nach der Modifikation war es beim Testen in der Testumgebung kein Problem. Nach dem Ersetzen mehrerer Klassen in der Produktionsumgebung wurde ein Fehler gemeldet und die Methode konnte nicht gefunden werden. Als ich mir die Methodensignatur ansah, war sie immer noch ein Array und wurde nicht ersetzt. Dem Quellcode nach zu urteilen, muss der aufrufende Ort nicht geändert werden, daher habe ich nicht damit gerechnet, ihn zu ersetzen, da die Testumgebung vollständig gepackt ist und es keine Probleme geben wird.
Die Signatur der Methode wird zum Zeitpunkt der Kompilierung bestimmt. Wenn sie nicht auf Quellcodeebene geändert werden muss, bedeutet dies nicht, dass die kompilierte Klasse nicht ersetzt werden muss.
Tatsächlich habe ich schon einmal gehört, dass in diesem Fall einer unregelmäßigen Kontraktion nach dem Ändern eines konstanten Werts im Quellcode nur die Klassendatei ersetzt wird, die die Konstante definiert, ohne alle Verweise auf die Konstante Dateien werden neu kompiliert und ersetzt, was zu unerklärlichen Problemen führt. Es handelt sich im Wesentlichen um das gleiche Problem wie bei der Methodensignatur.
Weitere verwandte Artikel zur Analyse der Java-Parameterliste variabler Länge und zu den bei der Verwendung zu beachtenden Punkten finden Sie auf der chinesischen PHP-Website!