Javaの中括弧はそれ自体で何を意味しますか?
-
04-07-2019 - |
質問
2つの方法で中括弧を使用するJavaコードがあります
// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
node.getId().apply(this);
}
// Curly braces by themselves:
{
List<PExp> copy = new ArrayList<PExp>(node.getArgs());
for(PExp e : copy)
{
e.apply(this);
}
}
outAMethodExp(node);
最初のif
ステートメントの後のスタンドアロンの中括弧はどういう意味ですか?
解決
余分な中括弧の唯一の目的は、スコープ制限を提供することです。 List<PExp> copy
はそれらの中括弧内にのみ存在し、それらの外側にスコープはありません。
これが生成されたコードである場合、コードジェネレーターがこれを行うので、<=>を挿入した回数を気にせず、おそらくこのスニペットが同じメソッドに複数回挿入された場合、変数の名前を変更します。
他のヒント
次にmatt bが書いたことに加えて、匿名ブレースのもう1つの使用法は、匿名クラスで暗黙的なコンストラクターを宣言することです。例:
List<String> names = new ArrayList<String>() {
// I want to initialize this ArrayList instace in-line,
// but I can't define a constructor for an anonymous class:
{
add("Adam");
add("Eve");
}
};
一部の単体テストフレームワークでは、この構文を別のレベルに移行しました。見慣れないので 見た目がないので、私はそんなに大ファンではありませんが、少なくともこの用途に出くわしたら何が起こっているのかを認識することは価値があります。
スコープ制限の回答に同意しますが、1つ追加します。
コードのセクションを折り畳み、ブレースを自動的に折りたたむエディタを持っている人のコードに、そのような構造が見られることがあります。彼らはそれを使用して、通常は折りたたまれる関数、クラス、ループなどに分類されない論理セクションにコードを折りたたみます。
実際に誰かがelseステートメントを忘れたと思います。
追加のブロックスコープを作成することに煩わされる正当な理由はめったにありません。この場合、およびほとんどの場合、誰かが巧妙なことをしているというよりも、誰かが自分の制御ステートメントを入力するのを忘れている可能性がはるかに高いです。
内部スコープを作成します。これらの中括弧内で宣言された変数は、それらの外側からは見えません。これはC / C ++にも適用されます。
ブレースは、switch / caseステートメントのスコープを縮小するのにも役立ちます。
switch(foo) {
case BAR:
int i = ...
...
case BAZ:
int i = ... // error, "i" already defined in scope
}
しかし、あなたは書くことができます
switch(foo) {
case BAR:{
int i = ...
...
}
case BAZ:{
int i = ... // OK
}
}
初期化ブロックにも使用されます。
これらは新しいスコープを定義します。つまり、このスコープで宣言されたものはすべて中括弧の外側に表示されません。
興味深いメモとして:中括弧は、実際には宣言のクラスを有効にします。
これは違法です:if(a) int f;
しかしこれは合法です:if(a) { int f; }
名前のないレベルのスコープを定義しているだけだと思います。
スコープを持ち込む、コピーはスコープの外側には表示されないため、後で同じ名前の別の変数を宣言できます。そして、そのスコープを終了した直後にガベージコレクターによって収集できます。この場合、 copy は一時変数として機能するため、良い例です。