81

中括弧を 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最初のステートメントの後の独立した中括弧は何を意味しますか?

4

11 に答える 11

122

追加の中括弧の唯一の目的は、スコープ制限を提供することです。List<PExp> copywill はこれらの中かっこ内にのみ存在し、それらの外にはスコープがありません。

これが生成されたコードである場合、コードジェネレーターがこれを行うと想定しているため、挿入した回数をList<PExp> copy心配する必要はなく、このスニペットの場合に変数の名前を変更する可能性を心配する必要もなく、コード (このような) を挿入できます。同じメソッドに複数回挿入されています。

于 2008-10-27T19:15:40.553 に答える
27

私は Matt b が書いたものを 2 番目に追加します。私が見た匿名中かっこの別の使用法は、匿名クラスで暗黙のコンストラクターを宣言することです。例えば:

  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");
      }

  };

一部の単体テスト フレームワークは、この構文を別のレベルに引き上げており、完全にコンパイルできないように見える洗練されたものを動作させることができます。なじみがないように見えるので、私自身はそれほど大ファンではありませんが、少なくともこの使用法に出くわした場合に何が起こっているのかを認識することは価値があります.

于 2008-10-28T01:17:13.070 に答える
8

範囲制限の回答には同意しますが、1 つ追加します。

コードのセクションを折りたたむのが好きで、ブレースを自動的に折りたたむエディターを持っている人のコードで、そのような構造を目にすることがあります。彼らはそれを使用して、通常は折り畳まれる関数、クラス、ループなどに分類されない論理セクションにコードを折り畳みます。

于 2008-10-28T01:21:22.937 に答える
5

実際、誰かがelseステートメントを忘れたと思います。

わざわざ追加のブロック スコープを作成する正当な理由はめったにありません。この場合、そしてほとんどの場合、誰かが巧妙なことをしていたというよりも、制御ステートメントを入力するのを忘れた可能性がはるかに高いです。

于 2008-10-27T19:18:03.810 に答える
2

それらは内部スコープを作ります。これらの中かっこの中で宣言された変数は、中かっこの外では見えません。これは C/C++ にも当てはまります。

于 2008-10-27T19:14:22.897 に答える
1

初期化ブロックにも使用されます。

于 2010-12-16T22:39:56.973 に答える
1

中括弧は、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
  }
}
于 2015-03-16T10:23:08.227 に答える
0

名前のないレベルのスコープを定義しているだけだと思います。

于 2008-10-27T19:14:51.290 に答える
0

これらは新しいスコープを定義します。つまり、このスコープで宣言されたものはすべて中括弧の外では見えません。

于 2008-10-27T19:15:15.813 に答える
0

スコープを持ってくると、コピーはスコープの外では見えないので、後で同じ名前の別の変数を宣言できます。また、そのスコープを終了した直後に、ガベージ コレクターによって収集できます。この場合、コピーは一時変数として機能するため、良い例です。

于 2008-10-27T19:18:04.060 に答える
0

興味深いことに、中かっこは実際にはステートメントのクラス、つまり宣言を有効にします。

これは違法です:if(a) int f;

しかし、これは合法です:if(a) { int f; }

于 2008-10-27T19:47:27.730 に答える