2012-10-30 22 views
2

下面是一個有效的Java程序:放置任意大括號作爲語句 - 它們是什麼意思?

public class _ { 

    public static void main(String[] args) { 
     { 
      { 
       { 
        { 

        } 
       } 
      } 
     } 
    } 

} 

做那些花括號添加額外的語義?還是他們對待就像空白?

+5

好的類名;-):'_ _o_ = new _();' – assylias

+0

對Haskell,Python,...之間的Java不太確定,使用下劃線的程序員有隱含的含義'無所謂'。在Ruby中,它甚至具有編譯器的一些實際語義:http://po-ru.com/diary/rubys-magic-underscore/ – vemv

+2

@assylias。爲什麼'_o_'作爲參考名稱?只是'_'會做 - >'_ _ = new _();'lol –

回答

9

花括號只是在您的主要方法內創建一個本地塊範圍。在塊內聲明的變量在外面不可見。

這種編碼方式用於最小化局部變量的範圍。

public void someMethod() { 
    { 
     int x = 10; 
     System.out.println(x); // Ok 
    } 
    System.out.println(x); // Error, x not visible here 
} 

這是一個很好的做法,以儘量減少您所創建的局部變量的範圍,特別是當你知道他們不會在你的程序在其他地方使用。所以,讓它在更大的範圍內直到結束是沒有意義的。只需創建一個本地塊範圍,以便在塊結束後立即有資格獲得Garbage Collection

另請參閱@Bohemian's下面的答案也引用一個更多的好處。

+0

就GC而言,該對象在最後一次使用本地變量後立即符合條件。 HotSpot使用這個例程。 –

+0

@MarkoTopolnik。那麼真正的原因是不能讓這個變量在不打算使用的地方使用?你能發表一些很好的理由嗎? –

+0

是的,有時它有助於重用相同的var名稱,例如在使用大量相同類型的對象的GUI構建代碼中(例如'GridBagConstraints')。而且,作爲@bohemian筆記下面,他們是偉大的複製粘貼代碼:) –

1

花括號是爲了定義和限制範圍。由於他們沒有附上任何陳述或聲明,它們將被編譯器消除。

1

額外牙套的唯一目的是提供範圍限制。變量a

void ad() 
    { 
    int a; 
    } 

將只有那些括號內的存在,並讓他們之外沒有範圍。

4

他們是一個代碼塊。他們可以方便的時候包含局部變量聲明的複製粘貼代碼:

{ 
    int x = foo * bar; 
    someMethod(x); 
} 
{ 
    int x = foo * y; // won't get "already defined variable" compile error 
    someMethod(x); 
} 

我也看到了他們用於代碼生成,這樣就可以了一些代碼安全地添加的方法和定義一個變量,而無需擔心它是否在方法的早期定義。

+0

+1對於複製粘貼參數:) –