Java Variable Parameterliste
Die Codekopie lautet wie folgt:
Klasse A {}
Da alle Klassen vom Objekt geerbt werden, können Sie das Objektarray als Parameter verwenden:
public class Parameter {static void printArray (Object [] args) {für (Objekt obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (String [] args) {printArray (neues Objekt [] {New Integer (47), New Float (3.14), neues Double (11.11)}); printArray (neues Objekt [] {"eins", "zwei", "da"}); printArray (neues Objekt [] {new a (), new a (), new a ()}); }} Für Java SE5 -Versionen nach dem Hinzufügen von Funktionen können Sie Folgendes schreiben:
public class Parameter {public static void printArray (Objekt ... args) {für (Objekt obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (String [] args) {printArray (New Integer (47), New Float (3.14), neues Double (11.11)); printArray (47, 3.14f, 11.11); printArray ("eins", "zwei", "drei"); printArray (neu a (), neu a (), neu a ()); printArray ((Objekt []) New Integer [] {1, 2, 3, 4}); printArray (); }} Sie können Objekt verwenden, um an die Parameterliste zu denken:
public class vararGtype {static void f (Zeichen ... args) {System.out.print (args.getClass ()); System.out.println ("Länge" + args.length); } static void g (int ... args) {System.out.print (args.getClass ()); System.out.println ("Länge" + args.length); } public static void main (String [] args) {f ('a'); F(); g (1); G(); System.out.println ("int []" + new int [0] .getClass ()); }}Dies ist eine in Java 5 eingeführte Funktion. Wenn die Anzahl der Parameter, die eine Methode empfangen möchte, ungewiss ist, kann diese Funktion nützlich sein.
Wenn beispielsweise IO -Operationen beteiligt sind, müssen Sie mindestens zwei Streams schließen: Eingabe und Ausgabe. Ich mag es, den Stream -Schließvorgang in die folgende Methode zu integrieren, damit mehrere Streams in nur einem Aufruf geschlossen werden können.
public static void CloSesilent (schließbar ... Spannungen) {für (schließbar schließbar: Verspannungen) {if (Clodable! = NULL) {try {clodable.close (); } catch (ioException ignoriert) {}}}}Dies ist der einzige Ort, an dem diese Funktion mit den folgenden Funktionen für die Verwendung geeignet ist:
Diese Parameter haben den gleichen Typ;
Die Anzahl der Parameter ist ungewiss, jeder ist optional;
Die Verwendungen dieser Parameter sind gleich, zum Beispiel werden die oben genannten Schließungen ausgeführt.
Die Parameterliste der Java-Variablenlänge kann nur am Ende der Methodenparameterliste platziert werden.
Implementierung der Parameterliste der Java-Variablenlänge
Die Implementierung der Parameterliste der Java-Variablenlänge wird durch den Compiler übergeben, um diese Parameter in ein Array einzudämmen.
Beispielsweise ist die Signatur der obigen Methode eigentlich: closesilent (schließbar [] Spannungen) void.
Auf eine Grube treten
Es gibt eine Methode, die von A und B an zwei Stellen aufgerufen wird. Im September muss ein Parameter zu A hinzugefügt werden. Als mein Verstand verrückt war, entschied ich mich für eine Parameterliste mit variabler Länge. Ich hatte das Gefühl, dass es nicht nötig war, es in B zu ändern, also wurde die Grube begraben.
Vor kurzem haben wir B gebeten, hier zwei neue Parameter hinzuzufügen, sodass wir der Parameterliste der Methode weiterhin Parameter hinzufügen. Die Arten dieser Parameter sind unterschiedlich, sodass die Parameterliste der variablen Länge als Objekttyp deklariert wird.
Die erste Grube ist, dass bei der Einnahme von Elementen mit Parametern variabler Länge in dieser Methode nicht berücksichtigt wird, dass einige Parameter nicht übergeben werden und das Array die Ausnahme von Abseits direkt zerstört wird. Ich hatte sofort das Gefühl, dass die Parameterliste der variablen Länge nicht gut war, also brauchte ich sie nicht und änderte sie in einen regulären Parameter mit fester Form.
Nach der Änderung ist es in Ordnung, es in der Testumgebung zu testen. Nachdem Sie mehrere Klassen in der Produktionsumgebung ersetzt haben, ist das Ergebnis ein Fehler. Die Methode kann nicht gefunden werden. Es hängt von der Methodensignatur ab, ist aber ein Array, und es wurde nicht ersetzt. Nach dem Quellcode zu urteilen, muss der Anrufort nicht geändert werden, daher habe ich nicht erwartet, ihn zu ersetzen. Da die Testumgebung vollständig verpackt ist, wird es keine Probleme geben.
Die Signatur der Methode wird zum Zeitpunkt der Zusammenstellung bestimmt. Die Quellcode -Ebene scheint keine Änderung zu erfordern, bedeutet jedoch nicht, dass die kompilierte Klasse nicht ersetzt werden muss.
Tatsächlich habe ich zuvor gehört, dass in diesem Fall unregelmäßige Pakete nach Änderungen eines konstanten Wertes im Quellcode nur die Klassendatei, die die Konstante definiert, ersetzt wird, und keine Neukompilierung und Ersetzen aller Klassendateien, die auf diese Konstante hinweisen, ist möglich, was zu unerklärlichen Problemen führt. Es ist im Wesentlichen das gleiche Problem wie die Methodensignatur.