2012-02-17 45 views

回答

53

這只是寫兩個不同的代碼塊來隱藏局部變量。

從問題的答案 「Anonymous code blocks in Java」:

塊限制變量的作用域。

public void foo() 
{ 
    { 
     int i = 10; 
    } 
    System.out.println(i); // Won't compile. 
} 

但在實踐中,如果你發現自己使用這樣的代碼塊,然後 它可能要重構該塊出來的 方法的標誌。

+7

沒有開玩笑。這是在學術環境或認證測試中出現的這些「整潔的Java技巧」之一,但專業Java開發人員可能永遠不會使用這些技巧。 – 2012-02-17 14:28:57

+16

在_few_的情況下,確保相鄰的代碼塊實際上是獨立的,以避免剪切粘貼錯誤,並避免在重新排序塊時進行不必要的更改。 – DNA 2012-02-17 14:39:43

+0

對於一些快速和髒的複製和粘貼是非常有用的;] – davidfrancis 2012-02-17 14:45:59

6

沒有。他們宣佈代碼塊。通常你不會使用它們。唯一的區別是如果你在第一個變量中聲明瞭一個變量 - 它將在第二個變量中不可訪問。

10

這兩個塊是獨立的。因此,無論您在第一個塊中可能具有哪些變量,都無法在第二個塊中或第一個塊之外的任何位置訪問。它被稱爲代碼隔離範圍

4

這兩個塊是按順序執行的。每個塊爲局部變量定義一個新的作用域。所以你可以有

int i; 

在這兩個塊。

7

{}引入了範圍和範圍內聲明的變量只存在於該範圍。例如:

if (test) { 

    int i = 0; 


    float i = 0; 
} 

將無法​​編譯爲i已經在同一範圍內已宣佈的兩倍。

if (test) { 
    { 
     int i = 0; 
    } 

    {  
     float i = 0; 
    } 
} 

會編好,因爲i沒有在同一範圍內聲明兩次。

21

的地方這可能是(略)有用的兩個例子 - 在單元測試,以及這兩者的圖形用戶界面,往往涉及重複代碼:

它在GUI構建,它是非常容易cut-有用粘貼線與一個組件,忘記更新他們的新組件,從而導致難以發現的錯誤,例如:

JButton button1 = new JButton("OK"); 
    button1.setEnabled(false); 
    button1.setAlignmentX(-1); 

    JButton button2 = new JButton("Apply"); 
    button1.setEnabled(false); 
    button1.setAlignmentX(-1); 

哎呀,我剛剛配置button1兩次。如果你把每個按鈕放在它自己的塊中,那麼編譯器就會發現這個錯誤。同樣,你可以創建在一個單獨的方法每個按鈕,但可能使它難以看清是怎麼回事(特別是由於缺乏在Java中的關鍵字參數):

JButton button_ok = makeButton("OK", false, -1); 
JButton button_apply = makeButton("Apply", true, 1); 
// what exactly is being set here? 

... 

// much later: 
private static JButton makeButton(String name, boolean enabled, 
     int alignment) 
{ 
    JButton button = new JButton(name); 
    button.setEnabled(enabled); 
    button.setAlignmentX(alignment); 
    return button; 
} 

...你可能會有許多方法結束,每個方法處理不同的參數變化,每個方法只能使用兩次。

+1

像這樣的錯誤是非常煩人的。可以看到大括號在這裏暫時有用。在重構和整理過程中也可能有用,但通常最好在最終代碼中刪除。如果你希望真正引起爭議並繼續或者在這個區塊內部破裂,也許他們有用。 – davidfrancis 2012-02-17 15:58:24

+3

如果您正在生成代碼並且不希望在特定腳本中兩次包含同一節點時不小心聲明變量,那麼它也可能很有用。我們的測試自動化團隊遇到了這樣的錯誤。 – Yamikuronue 2012-02-17 16:52:13

+0

使用構建器對於這種情況可能是一個更好的解決方案 - 它會給你更好的可讀性並消除你試圖阻止的錯誤類, – ireddick 2012-02-19 15:01:37

4

這些是匿名塊。它們被用來限制範圍。不僅在java中,而且在C#和C等其他語言中也是如此。