Frage

Ich habe einige Java-Code, der geschweiften Klammern auf zwei Arten

verwendet
// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
    node.getId().apply(this);
}

// Curly braces by themselves:
{
    List<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

Was diese Stand-alone geschweiften Klammern nach der ersten if Aussage bedeuten?

War es hilfreich?

Lösung

Der einzige Zweck der zusätzlichen Verstrebungen ist Anwendungsbereich-Limit zur Verfügung zu stellen. Die List<PExp> copy wird nur innerhalb dieser Klammern vorhanden sind, und außerhalb von ihnen keinen Raum haben.

Wenn dieser Code erzeugt wird, gehe ich davon aus dem Code-Generator dies tut, so dass es einige Code (wie diese) einsetzen kann, ohne zu befürchten, wie oft es eine List<PExp> copy eingeführt hat und ohne dass möglicherweise zu befürchten die Umbenennung Variablen, wenn diese Schnipsel in die gleiche Methode mehr als einmal eingesetzt ist.

Andere Tipps

Ich zweite, was matt b geschrieben, und ich will hinzufügen, dass eine anderweitige Verwendung ich von anonymen Klammern gesehen habe, ist eine implizite Konstruktor in anonymen Klassen zu erklären. Zum Beispiel:

  List<String> names = new ArrayList<String>() {
    // I want to initialize this ArrayList instace in-line,
    // but I can't define a constructor for an anonymous class:
      {
        add("Adam");
        add("Eve");
      }

  };

Einige Einheit-Test-Frameworks haben diese Syntax auf eine andere Ebene genommen, die einige glatte Dinge erlaubt, die völlig uncompilable aussehen zu arbeiten. Da sie aussehen nicht vertraut, ich bin nicht so ein großer Fan mich, aber es ist zumindest lohnt sich zu erkennen, was los ist, wenn Sie über diese Anwendung ausgeführt werden.

ich mit dem Umfang Limit Antwort zustimmen, würde aber eine Sache hinzufügen.

Manchmal sieht man ein Konstrukt wie die im Code von Menschen, die gerne Abschnitte ihres Codes falten und haben Editoren, die Klammern automatisch falten. Sie benutzen sie ihren Code in logische Abschnitte zu falten, die nicht in eine Funktion fallen, Klasse, Schleife, etc., die in der Regel nach oben gefaltet werden würde.

Ich würde eigentlich vermuten, dass jemand eine andere Aussage vergessen.

Es ist selten ein guter Grund, auch bei der Erstellung zusätzlichen Block Bereiche zu stören. In diesem und den meisten Fällen ist es viel wahrscheinlicher, jemand ihre Steuererklärung vergessen haben zu geben, als es ist, dass sie etwas Gescheites taten.

Sie machen einen inneren Umfang. Variable innerhalb dieser Klammern deklariert ist nicht sichtbar außerhalb von ihnen. Dies gilt auch für C / C ++.

Zahnspangen ist auch nützlich, um den Umfang in Switch / Case-Anweisungen zu reduzieren.

switch(foo) {
  case BAR:
     int i = ...
     ...
  case BAZ:
     int i = ... // error, "i" already defined in scope
}

Aber man kann schreiben

switch(foo) {
  case BAR:{
     int i = ...
     ...
  }
  case BAZ:{
     int i = ... // OK
  }
}

Es ist auch für Initialisierungsblöcke .

Sie definieren einen neuen Bereich, was bedeutet, dass in diesem Bereich erklärt alles, was außerhalb der geschweiften Klammern nicht sichtbar ist.

Als interessante Anmerkung: die Streben ermöglichen tatsächlich eine Klasse von Aussagen. Erklärungen

Dies ist illegal: if(a) int f;

, aber das ist legal: if(a) { int f; }

Ich denke, sie nur eine unbenannte Höhe und der Umfang definieren.

Die einen Bereich bringen, Kopie nicht sichtbar außerhalb davon, so dass Sie später eine andere Variable mit demselben Namen deklarieren können. Und es kann direkt vom Garbage Collector gesammelt werden, nachdem Sie diesen Bereich verlassen. In diesem Fall Kopie dient als temporären Variable, also ist es ein gutes Beispiel ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top