Ich habe Java-Code, der geschweifte 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 bedeuten diese eigenständigen geschweiften Klammern nach der ersten if
Aussage?
java
syntax
scope
curly-braces
Paul Wicks
quelle
quelle
copy
dass Müll vor deroutAMethodExp()
Rückgabe gesammelt werden kann . Wenn dies ein lang andauernder oder speicherintensiver Anruf ist, kann dies hilfreich sein. Ich habe "Vorteil" in Anführungszeichen gesetzt, weil das Refactoring in separate Methoden im Allgemeinen viel sauberer und klarer ist, als diese Syntax zu nutzen.Ich stimme dem zu, was matt b geschrieben hat, und ich füge hinzu, dass eine andere Verwendung von anonymen Klammern darin besteht, einen impliziten Konstruktor in anonymen Klassen zu deklarieren. 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 Unit-Testing-Frameworks haben diese Syntax auf eine andere Ebene gebracht, wodurch einige raffinierte Dinge, die völlig unkompilierbar aussehen, funktionieren. Da sie ungewohnt aussehen , bin ich selbst kein so großer Fan, aber es lohnt sich, zumindest zu erkennen, was los ist, wenn Sie auf diese Verwendung stoßen.
quelle
super(...)
.Ich stimme der Antwort auf die Bereichsbegrenzung zu, möchte aber eines hinzufügen.
Manchmal sieht man ein solches Konstrukt im Code von Personen, die gerne Teile ihres Codes falten und über Editoren verfügen, die Klammern automatisch falten. Sie verwenden es, um ihren Code in logischen Abschnitten zusammenzufassen, die nicht in eine Funktion, Klasse, Schleife usw. fallen, die normalerweise zusammengelegt werden.
quelle
Ich würde tatsächlich vermuten, dass jemand eine andere Aussage vergessen hat.
Es gibt selten einen guten Grund, sich die Mühe zu machen, zusätzliche Blockbereiche zu erstellen. In diesem und den meisten Fällen ist es weitaus wahrscheinlicher, dass jemand vergessen hat, seine Steueranweisung einzugeben, als dass er etwas Kluges getan hat.
quelle
Sie bilden einen inneren Bereich. Die in diesen Klammern deklarierte Variable ist außerhalb nicht sichtbar. Dies gilt auch für C / C ++.
quelle
Klammern sind auch nützlich, um den Umfang von switch / case-Anweisungen zu verringern.
switch(foo) { case BAR: int i = ... ... case BAZ: int i = ... // error, "i" already defined in scope }
Aber du kannst schreiben
switch(foo) { case BAR:{ int i = ... ... } case BAZ:{ int i = ... // OK } }
quelle
Es wird auch für Initialisierungsblöcke verwendet .
quelle
static
sonst sein ein Beispiel Initialisierungsblock.Sie definieren einen neuen Bereich, was bedeutet, dass alles, was in diesem Bereich deklariert ist, außerhalb der geschweiften Klammern nicht sichtbar ist.
quelle
Als interessanter Hinweis: Die geschweiften Klammern ermöglichen tatsächlich eine Klasse von Anweisungen: Deklarationen.
Das ist illegal:
if(a) int f;
aber das ist legal:
if(a) { int f; }
quelle
Ich denke, sie definieren nur eine unbenannte Ebene des Umfangs.
quelle
Wenn Sie einen Bereich mitbringen, wird die Kopie außerhalb des Bereichs nicht sichtbar sein, sodass Sie später eine andere Variable mit demselben Namen deklarieren können. Und es kann vom Garbage Collector direkt nach dem Verlassen dieses Bereichs erfasst werden. In diesem Fall dient die Kopie als temporäre Variable, daher ist dies ein gutes Beispiel.
quelle