Javaスイッチの場合:中括弧の有無は?


85

中括弧を付けた次の2つのスニペットについて考えてみます。

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

中括弧なし:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

中かっこ付きのスニペットでは、各ケースを中かっこで囲むことによって新しいスコープが作成されることを知っています。ただし、各ケースに新しいスコープが必要ない場合(つまり、変数名が再利用されていない場合)、ケースで中括弧を使用すると、パフォーマンスが低下しますか?

回答:


99

ケースで中括弧を使用すると、パフォーマンスが低下しますか?

無し。

中括弧は、コンパイラが変数、条件、関数宣言などのスコープを把握するのに役立ちます。コードが実行可能ファイルにコンパイルされると、実行時のパフォーマンスには影響しません。


21

実行の観点からはパフォーマンスの低下はありません。

解析するものがまだあるため、コンパイルの観点からはパフォーマンスがわずかに低下しますが、実際にそれを心配している人は、コードをすべて1行で記述する必要があります:-)

そして今、私たちの投稿の意見の部分のために...私は常に{と}を入れています。なぜなら、保守性には後日入れなければならない可能性があり、それらを入れるのは苦痛になる可能性があるというペナルティがあるからです。後で...しかしそれは103%の個人的な好みです。


自分では答えがわからないので少し気になります... @ TofuBeer、いつ中かっこを追加する必要がありますか?また、私は保守性の点に完全に同意します。保守性の問題であるATMは見当たりません。編集:気にしないでください。以下の残りの回答を読みました。
nyaray 2013

場合によってはC ++で行うので、両方の言語で作業する場合は、どちらかに入るのも悪い習慣ではありません。
TofuBeer 2013

13

私たちが知っているように、スイッチケースのブレースは必要ありません。中括弧のケースを使用すると、ケースの範囲について混乱が生じる可能性があります。

冒頭の中括弧は、一般に、関数の開始、ループの開始、クラス宣言の開始、配列の初期化の開始など、意味のあるものに関連付けられています。ステートメント。したがって、中括弧を使用することは、無知な読者にはケースの異なる範囲のアイデアを意味するようです。したがって、プログラミングの可読性を高めるために、中括弧の使用は避けたほうがよいでしょう。

すなわち、私が次のようなものを持っているとき、

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

「Hellofrom1」が印刷されます。ただし、中括弧を使用すると、ループやメソッドなどの場合に中括弧が一般的に何を意味するかをすでに知っているため、ケースが「}」で終わることを知らない読者が示唆する場合があります。

'C'にjump-to-labelステートメントがあるように、コントロールはcaseにシフトし、実行を継続します。したがって、その理解の下で、スイッチのケースを作成するときに中括弧を使用するのは悪い習慣です。

技術的に言えば、有効な構文で使用する場合は、コードの任意のブロックを追加の中括弧で囲むことができます。スイッチで中括弧を使用すると、少なくとも私には非常に悪いように見えます。これは、上記で述べたように別の感覚を与えるようです。

私の提案:スイッチケースに周囲の中括弧を使用することは避けてください。


5
これに同意しません。中括弧を使用し、中括弧の外にコードを書くことは非常に悪い形式です、はい、しかしこれは中括弧の使用自体を信用しません。
Max Roncace 2017

12

中かっこ付き。

switchステートメントでうまくいかないことがたくさんあるので、できる限りそれらを避けようとします。

  1. 休憩を忘れて、ケースのフォールスルーが発生する
  2. デフォルトのケースを忘れて、分類されていない条件をキャッチしない
  3. ケースステートメント間で変数を誤って再利用するか、さらに悪いことに、ケースステートメント間で変数を共有している変数に影響を与えます。

中括弧を使用することは、ケースステートメント間で変数が意図的および偶発的に共有されるのを防ぐ1つの方法です。


8
ポイント1と2を含めることは、この質問に対して誤解を招くものでした(私にとって)。あなたの締めくくりは、中括弧が3つだけを解決することを明示的に言うべきです-中括弧が休憩の必要性を排除したことを意味すると思い、それを試しました。
ataulm 2013年

ポイント3は意味がありません。switchステートメントの親スコープで宣言されていない限り、変数を再利用することはできません。これは、ケース内で変数を宣言した場合、それを別のcaseステートメントで使用できないことを意味します。(親スコープ内の)switchステートメントの上で変数を宣言する場合、中括弧を使用するかどうかは関係ありません。caseステートメントは変数にアクセスできます。
dsingleton 2014

ケース1で宣言された変数がケース2でもスコープ内にある可能性があることを(再)発見しました。例:...case 1: int a = 10; break; case 2: int a = 11; break; ...コンパイルされません。(Oracle JDK 8でテスト済み)
anuragw

5

この質問はおそらく「論争的」(BRACE WAR!)として閉じられるでしょうが、一体何なのでしょう。ケースの後のブレースが実際に好きです。私には、醜いswitch構文が他の言語構造のように見えるようになります。(この「ケース」で中括弧を使用してもペナルティはありません)


それは一種の客観的な質問だと思います...私は議論の余地があることを撤回します
Andy White

中かっこなしの方が好きです...中かっこは不要なノイズをたくさん追加します。
cdmckay 2009年

ええ、もっとこうだったらいいのにと思います:case(FOO){x = x + 1} case(BAR){y = y + 1}
Andy White

賢明な空白==いい。不必要な中括弧==吸う。
Shog9 2009年

3
ホワイトスペース==タブとスペースの組み合わせ==吸う(タブとスペースのコメントをミックスに入れると思っただけです)
Andy White

5

変数名が再利用されていないため、中括弧は省略できると言います。変数名を再利用するということは、同じタイプの新しい変数を宣言することを意味すると思います。

中括弧は、実際には、同じ変数を異なるcasesで誤って再利用しないようにするために最も役立ちます。今日は変数を宣言していませんが、明日誰かが変数を追加します。中括弧がないと、コードでエラーが発生しやすくなります。


3

スイッチケースには中括弧は使用しません。

  • switchステートメントは、中括弧なしですでに十分にバロックに見えます。

  • スイッチケースは非常に短くする必要があります。変数を宣言する必要がある場合、それは間違っていることを示しています。

500行以上のスイッチケースをスポーツするいくつかのレガシーCコードを維持することになりました...


1

今まで考えたことがありません。case句に中括弧が必要になったことがないため、中括弧が必要な理由がわかりません。個人的には、「保守が簡単になる」という考えには賛成しません。それは単なるゴミです。コードが意味をなし、文書化されていれば、保守が容易になります。

中括弧なし...構文が少ないほど多い


{と}は物事を際立たせ、読みやすくします(IMO)。
TofuBeer 2009年

うん。かつて変更しなければならなかったメソッド(1行のコードを追加するのに約4時間かかりました)の話を共有しようとしましたが、コードは非常識でした(印刷時に長さ約10ページ、幅4ページ)のでそうではありません典型的なケース。ただし、{}を使用していた場合は、追加するのに1分かかります。
TofuBeer 2009年

ここで重要なのは、元のプログラマーがコードを読みやすくするために{}ブロックを挿入する努力をした場合、10ページのswitchステートメントを記述してコードを次のように変更したことを実際に気にかけていた可能性があるということです。少し狂気が少ない
Gareth Davis

swtichは夢だったでしょう..それはネストされたif / elses ... COBOLプログラマーによってC ++コードで書かれました...私はその後間もなく終了しました。
TofuBeer 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.