私はいくつかのJava 2つの方法で中括弧を使用するコードを持っています
// 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
は、それらの中括弧内にのみ存在し、それらの外側にはスコープを持ちません。
これが生成されたコードである場合、コードジェネレーターがこれを行うため、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");
}
};
一部の単体テストフレームワークは、この構文を別のレベルに引き上げており、完全にコンパイルできないように見えるいくつかの滑らかな機能を許可しています。彼らはlookなじみがないので、私自身はそんなに大ファンではありませんが、少なくともこの用途に出くわした場合は何が起こっているかを認識する価値があります。
スコープ制限の回答に同意しますが、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はスコープの外では見えないので、後で同じ名前で別の変数を宣言できます。そして、そのスコープを終了した直後にガベージコレクターによって収集できます。この場合、copyは一時変数として機能するため、良い例です。