2011-09-07 66 views
5

我最近讀了一些關於{}的特殊語法的代碼,我問過一位更有經驗的Java開發人員,但他也無法回答。Java中的單獨代碼是什麼?

public void doSomething() { 
    someWorks(); 
    { 
     someVariables; 
     someMoreWorks(); 
    } 
    someEvenWorks(); 
    { 
     ... 
    } 
} 

爲什麼代碼作者將這些行放在{}之內?我猜測,{}內聲明的變量將公佈執行退出之後{},對的,因爲我不能再{}外部訪問這些?

+4

你說得對 - 它與限制範圍有關。 – duffymo

+3

我覺得這是[這個問題](http://stackoverflow.com/questions/5466974/multiple-open-and-close-curly-brackets-inside-method-java) – momo

回答

6

是的,唯一的區別是作用域。

有時這可能是一次性的代碼非常有用,例如,你希望能夠通過剪切和粘貼塊,並稍作改變,則可能重新排序塊微基準測試。

我會很少(如果有的話)有「真正的」代碼這樣的事情雖然。

+0

我有時用這個複製「真正的「代碼來限制變量的範圍,但它有一種太長的方法的難聞氣味。 – Thilo

+0

我想,這可能非常有用!例如,您需要臨時變量來保存某個值,您可以將它們放入{}中,然後再次使用該名稱(具有不同的數據類型)。或者,如果函數是一個很長的工作,GC可能會收集{}中的臨時變量。 –

+2

@ W.N。我不確定它是否會影響GC - 但如果我有一個很長的方法,我寧願重構。 –

4

這給了他一個嵌套的範圍申報「更多的本地」變量。

我猜在{}中聲明的變量會在退出{}之後立即發佈,因爲我無法再訪問{}以外的這些變量了嗎?

取決於你對「釋放」的定義(它們很可能不會被垃圾收集,直到方法結束,所以如果這很重要,你可能想把它們清空),但是。

其他的花括號中很少見到的用途包括類和實例初始化:

class A { 
    static { 
     // some class initialization code 
    } 

    { 
     // some instance initialization code 
    } 

} 
+0

那麼,這意味着這些變量所使用的內存在退出{}塊後沒有被釋放? –

+0

我不確定。看到這個問題:http://stackoverflow.com/questions/473685/does-it-help-gc-to-null-local-variables-in-java – Thilo

1

,作者把這些變量{事實}表示這些變量的範圍僅是由定義的方法{};反過來,一旦方法結束執行,這些變量將用於垃圾收集。