2013-06-13 12 views
9

In einem Beispiel für Android-Code in einem Buch gegeben in Bezug auf Aktionsleiste, angesichts die Probe ist wie folgt:mit {} nach Semikolon

MenuItem menu1 = menu.add(0, 0, 0, "Item 1"); 
{ 
    menu1.setIcon(R.drawable.ic_launcher); 
    menu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
} 

Wie geschweiften Klammern nach einem Semikolon möglich verwendet? Es gibt eindeutig ein Konzept, das ich hier nicht verstehe.

+3

Soweit ich weiß, ist dies das gleiche wie wenn Sie die {} verlassen würden. menu.add ist ein Befehl, menu.setIcon ist der nächste, menu.setShowAsAction der nächste. Klammern können verwendet werden, um Codeblöcke zu deklarieren. – damian

+0

Nur ein Duplikat von * wenn Sie wissen, * es ist ein anonymer Codeblock. – Raedwald

Antwort

17

Sie sind in diesem Fall völlig optional und haben keine Nebenwirkung. In Ihrem Beispiel dient es lediglich dazu, den Code lesbarer zu machen, indem die Eigentumszuweisung, die zu dem Steuerelement gehört, beabsichtigt ist. Sie könnten es auch ohne die Zahnspange tun. Aber wenn Sie ein Werkzeug verwenden, um Ihren Code neu zu formatieren, ist die Einrückung wahrscheinlich weg.

Wenn Sie jedoch eine Methode haben, und Sie setzen {} in dort können Sie einen neuen Variable Bereich erstellen:

void someMethod() { 
    { 
     int x = 1; 
    } 
    // no x defined here 
    { 
     // no x here, so we may define a new one 
     string x = "Hello"; 
    } 
} 

Sie können einen neuen Bereich überall in einer Methode beginnen, wo Sie eine Anweisung beginnen (eine Variablendeklaration, ein Methodenaufruf, eine Schleife usw.)

Hinweis: Wenn Sie zum Beispiel eine if-Anweisung haben, erstellen Sie auch einen neuen Variablenbereich mit diesen geschweiften Klammern.

void someMethod() { 
    if (someThing) { 
     int x = 1; 
    } 
    // no x defined here 
    if (somethingElse) { 
     // no x here, so we may define a new one 
     string x = "Hello"; 
    } 
} 

Das gleiche gilt für während, für, versuchen, fangen und so weiter. Wenn man darüber nachdenkt, funktionieren sogar die Klammern eines Methodenkörpers auf diese Weise: Sie erzeugen einen neuen Bereich, der eine "Ebene" über dem Klassenbereich ist.

+1

eine klare Erklärung. Danke. –

+0

Gern geschehen! – Mene

15

Es heißt anonyme Code-Blöcke, sie sollen restrict the variable scope sein.

0

Das sind Initialisierungsblöcke.

Ich glaube nicht, dass dies die korrekte Verwendung von Initialisierungsblock ist. Neben dem von Ihnen erstellten Beispiel werden diese Blöcke nur zur Initialisierung verwendet. Click Here für detaillierte Ansicht.

+1

Sie * könnten * ein Initialisierer sein, aber sie könnten auch eine einfache Blockanweisung innerhalb einer Methode sein. Wir können es nicht sagen, ohne den Kontext zu sehen. –

+0

sicher, die Verwendung ist vollständig abhängig vom Entwickler – R9J