可能性の重複:
Anonymous code blocks in Java{{} {}の連続する2つのブロックは何をしますか?
私は次のように出くわしました。
if (test) {
{
// statements 1
}
{
// statements 2
}
}
これは初めてのことです。どのように機能するのですか?
可能性の重複:
Anonymous code blocks in Java{{} {}の連続する2つのブロックは何をしますか?
私は次のように出くわしました。
if (test) {
{
// statements 1
}
{
// statements 2
}
}
これは初めてのことです。どのように機能するのですか?
ローカル変数を非表示にするために、2つの異なるコードブロックを作成しています。質問 "Anonymous code blocks in Java" への答えから
:
ブロックは、変数のスコープを制限します。実際に
public void foo() { { int i = 10; } System.out.println(i); // Won't compile. }
、しかし、あなたは、このようなコードブロックを使用して自分自身を見つける場合は、その後 それはおそらくあなたが 方法に出ているブロックをリファクタリングしたい兆候です。
何もありません。彼らはコードのブロックを宣言します。通常、あなたはそれらを使用しません。唯一の違いは、最初の変数に変数を宣言する場合です.2番目の変数にはアクセスできません。
2つのブロックは独立しています。つまり、最初のブロックにある変数は、2番目のブロック(または最初のブロックの外側)にはアクセスできません。コードアイソレーションまたはスコープと呼ばれています。
2つのブロックが順番に実行されます。各ブロックはローカル変数の新しいスコープを定義します。だからあなたは持っている可能性があります
int i;
両方のブロックです。
{}
には、スコープ内に宣言されたスコープと変数がそのスコープに対してのみ存在します。たとえば:
if (test) {
int i = 0;
float i = 0;
}
はi
が同じスコープに2回宣言されているようにコンパイルに失敗するだろう。
if (test) {
{
int i = 0;
}
{
float i = 0;
}
}
i
は同じスコープ内で2回宣言されていないため、コンパイル時に問題ありません。これは(わずかに)役立つことができる場所の
二つの例 - ユニットテストでは、と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度だけ使用される多数の方法で終わることがある。
このようなバグは非常に迷惑です。中括弧がここで一時的に役立つのを見ることができました。リファクタリングと整理の際にも役立ちますが、通常は最終的なコードでは最もよく削除されます。あなたが本当に議論の余地があり、ブロック内で継続したり壊れたりしたいのであれば、彼らはおそらく使用しているかもしれません。 – davidfrancis
コードを生成していて、特定のスクリプトに同じノードを2回含むと誤って変数を2回宣言したくない場合にも便利です。私たちのテスト自動化チームは、そのようなバグに遭遇しました。 – Yamikuronue
この場合、ビルダーを使用する方がよいでしょう。これは、読みやすさを向上させ、防止しようとしているエラーのクラスを排除し、 – ireddick
これらは匿名ブロックです。スコープを制限するために使用されます。 Javaだけでなく、C#やCのような他の言語でも。
冗談なし。これは、アカデミックな環境や認定試験に登場するこれらの「きちんとしたJavaのテクニック」の1つですが、プロのJava開発者は決して使用しないでしょう。 –
実際には、隣接するコードブロックが実際に独立していることを確認し、カットアンドペーストエラーを回避し、ブロックを並べ替えるときに不必要な変更を避けることは、実際には本当に便利です。 – DNA
はいいくつかの素早く汚れたコピー&ペーストには非常に便利です] – davidfrancis