2012-02-17 4 views

答えて

53

ローカル変数を非表示にするために、2つの異なるコードブロックを作成しています。質問 "Anonymous code blocks in Java" への答えから

ブロックは、変数のスコープを制限します。実際に

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

、しかし、あなたは、このようなコードブロックを使用して自分自身を見つける場合は、その後 それはおそらくあなたが 方法に出ているブロックをリファクタリングしたい兆候です。

+7

冗談なし。これは、アカデミックな環境や認定試験に登場するこれらの「きちんとしたJavaのテクニック」の1つですが、プロのJava開発者は決して使用しないでしょう。 –

+16

実際には、隣接するコードブロックが実際に独立していることを確認し、カットアンドペーストエラーを回避し、ブロックを並べ替えるときに不必要な変更を避けることは、実際には本当に便利です。 – DNA

+0

はいいくつかの素早く汚れたコピー&ペーストには非常に便利です] – davidfrancis

6

何もありません。彼らはコードのブロックを宣言します。通常、あなたはそれらを使用しません。唯一の違いは、最初の変数に変数を宣言する場合です.2番目の変数にはアクセスできません。

10

2つのブロックは独立しています。つまり、最初のブロックにある変数は、2番目のブロック(または最初のブロックの外側)にはアクセスできません。コードアイソレーションまたはスコープと呼ばれています。

4

2つのブロックが順番に実行されます。各ブロックはローカル変数の新しいスコープを定義します。だからあなたは持っている可能性があります

int i; 

両方のブロックです。

7

{}には、スコープ内に宣言されたスコープと変数がそのスコープに対してのみ存在します。たとえば:

if (test) { 

    int i = 0; 


    float i = 0; 
} 

iが同じスコープに2回宣言されているようにコンパイルに失敗するだろう。

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

    {  
     float i = 0; 
    } 
} 

iは同じスコープ内で2回宣言されていないため、コンパイル時に問題ありません。これは(わずかに)役立つことができる場所の

21

二つの例 - ユニットテストでは、とGUIで、多くの場合、反復コードを伴うどちらも:

カット - する信じられないほど簡単であるところには、GUIの構築に有用ですアンドペーストラインは例えば、見つけにくいバグにつながる、一つの成分に関連して、新しいコンポーネントのためにそれらを更新するのを忘れ:

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

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

はおっと、私は2回だけ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; 
} 

...そしてあなたそれぞれが異なるバリエーションのパラメータを扱い、それぞれが2度だけ使用される多数の方法で終わることがある。

+1

このようなバグは非常に迷惑です。中括弧がここで一時的に役立つのを見ることができました。リファクタリングと整理の際にも役立ちますが、通常は最終的なコードでは最もよく削除されます。あなたが本当に議論の余地があり、ブロック内で継続したり壊れたりしたいのであれば、彼らはおそらく使用しているかもしれません。 – davidfrancis

+3

コードを生成していて、特定のスクリプトに同じノードを2回含むと誤って変数を2回宣言したくない場合にも便利です。私たちのテスト自動化チームは、そのようなバグに遭遇しました。 – Yamikuronue

+0

この場合、ビルダーを使用する方がよいでしょう。これは、読みやすさを向上させ、防止しようとしているエラーのクラスを排除し、 – ireddick

4

これらは匿名ブロックです。スコープを制限するために使用されます。 Javaだけでなく、C#やCのような他の言語でも。

関連する問題