Heim  >  Artikel  >  Java  >  Analysieren der Parameterliste variabler Länge von Java und Hinweise, die bei der Verwendung zu beachten sind

Analysieren der Parameterliste variabler Länge von Java und Hinweise, die bei der Verwendung zu beachten sind

高洛峰
高洛峰Original
2017-01-19 15:13:041437Durchsuche

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());
  }
}

Dies ist eine Funktion, die in Java 5 eingeführt wurde. Wenn die Anzahl der Parameter, die eine Methode empfangen muss, unsicher ist, kann diese Funktion nützlich sein.

Wenn beispielsweise E/A-Vorgänge beteiligt sind, müssen mindestens zwei Streams geschlossen werden: Eingabe und Ausgabe. Ich kapsele den Stream-Schließvorgang gerne in die folgende Methode, sodass mehrere Streams mit nur geschlossen werden können ein Anruf.

public static void closeSilent(Closeable... closeables) {
   for (Closeable closeable : closeables) {
     if (closeable != null) {
        try {
          closeable.close();
        } catch (IOException ignored) {
        }
     }
   }
}

Dies ist meiner Meinung nach der einzige Ort, an dem diese Funktion mit den folgenden Eigenschaften verwendet werden kann:

Diese Parameter haben den gleichen Typ Anzahl der Parameter Nicht sicher, jeder einzelne ist optional;

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.

Implementierung der Java-Parameterliste variabler Länge


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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn