web-dev-qa-db-ja.com

javaのIfステートメントから中括弧を削除するのに違いはありますか

基本的なJavaのnewbostonsチュートリアルを見ながら、彼はこのようなifステートメントを行うことを教えてくれます(中括弧に注意してください)。

if("pie"== "pie"){
    System.out.println("Hurrah!");
}

だから中かっこを削除してみた

if("pie"== "pie")
    System.out.println("Hurrah!");

そして、それはまだ機能します!私はJavaが初めてなので、なぜそれが機能するのかわかりません。そして、中括弧を削除(または追加)することで利点/欠点が得られるかどうかを知りたいです。

41
user735977

single statementの場合は同じままですが、ifブロックで複数のステートメントをグループ化する場合は、中括弧を使用する必要があります。

if("pie"== "pie"){
    System.out.println("Hurrah!");
    System.out.println("Hurrah!2");
}

if("pie"== "pie")
    System.out.println("Hurrah!"); //without braces only this statement will fall under if
    System.out.println("Hurrah!2"); //not this one

表示されるはずです: Javaのブロック

ブロックとは、中括弧で囲まれた0個以上のステートメントのグループであり、単一のステートメントが許可されている場所であればどこでも使用できます。次の例のBlockDemoは、ブロックの使用法を示しています。

class BlockDemo {
     public static void main(String[] args) {
          boolean condition = true;
          if (condition) { // begin block 1
               System.out.println("Condition is true.");
          } // end block one
          else { // begin block 2
               System.out.println("Condition is false.");
          } // end block 2
     }
}

(上記のリンクの例)

35
Habib

@rajeshが言うように、本文が単一のステートメントである場合、中括弧はオプションです。

とはいえ、単一のステートメントの場合でも中括弧を残すことは、一部のコーディングスタイルで推奨されます。これは、後でコードを変更するときにエラーが発生する可能性が低いためです。

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("Tricked you");

2番目の印刷、Tricked youは、実際にはifにありません。インデントのために、そのように見えます。

ただし、それは単なるスタイルポイントであり、広く受け入れられているわけではありません。確かに、有能なプログラマーは両方のフォームを読むことができる必要があります。

5
drquicksilver

いいえ、まったく違いはありません。中括弧のペアは、複数のステートメントを単一のステートメントにします。 ifwhileforなどは、単一のステートメントを想定しています。ステートメントを1つだけ保護する必要がある場合は、中括弧は必要ありません。

ただし、多くのソフトウェアショップは、単一のステートメントに対してもブレースを使用することを主張しています。理由は次のようなエラーです。

if (x > 20)
    x -= 7;
    y -= 8;

上記の記述は誤解を招く可能性があります。インデントにより、両方の割り当てが保護されていると信じられますが、実際には最初の割り当てのみが保護されています。その理由は、Javaの空白は重要ではありません。文をインデントしても、プログラムのフロー全体での配置は変わりません。上記のようなエラーを見つけるのは非常に難しいため、そもそもそれらを防ぐルールは良い考えです。

5
dasblinkenlight

これは、Java、C++、C、C#などの多くの言語に適用されるスタイルの問題です。

コードブロックに1行しか含まれていない場合は、中かっこを省略できます。これは、制御構造(if、while、for、do-while)に適用されます。

たとえば、次の2つのループは同等です。

for(int i=0; i<100; i++)
  doSomething(i);



for(int i=0; i<100; i++) {
  doSomething(i);
}

{}:を省略することの利点コードを簡潔にすることができます。つまり、行が少なくなります。読みやすいと感じる人もいます。

{}:を省略することの短所後でコードを変更し、コードブロックに別の行を追加する必要がある場合は、これらの{}を追加することを忘れないでください。そうでない場合、以下のコードを記述します。

for(int i=0; i<100; i++)
  doSomething(i);
  doSomethingElse(i);

これは本当に次と同等です:

for(int i=0; i<100; i++) {
  doSomething(i);
}
doSomethingElse(i);
3
Thorn

ただし、後でコードを編集すると実際の危険が発生します。次のようなものを編集するのは比較的簡単です。

if (someCondition) 
    // do something 

if (someCondition) 
    // do something
    // do something else important

someConditionがtrueの場合にのみ、「他の重要なことをする」が実行されると考えます。インデントは誤解を招く:-)

ブラケットを使用すると、この危険はありません。

2
matt freake

これには欠点があります。これまでに述べた答えは正しいです。しかし、物事のセキュリティの観点からは、いくつかの欠点があります。支払いチームで働いていたため、セキュリティはそのような決定を動機付けるはるかに強力な要因です。次のコードがあるとしましょう:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

ここで、何らかの内部問題のためにこのコードが機能していないとしましょう。入力を確認します。したがって、次の変更を行います。

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

問題を修正してこのコードを展開するとします(そして、おそらくレビュー担当者であり、「Prod」条件内にないため、これが問題を引き起こさないと思います)。魔法のように、生産ログは、ログを見ることができるすべての人に見える顧客のクレジットカード情報を印刷するようになりました。それらのいずれか(悪意がある)がこのデータを取得した場合、神は禁止します。

したがって、括弧を付けずに、少し不注意なコーディングを行うと、多くの場合、安全な情報が侵害される可能性があります。また、Java CERT-Software Engineering Institure、CM により、脆弱性として分類されます。

2
kung_fu_coder

ifの後にステートメントが1つしかない場合、中括弧は必須ではありません。

if条件に該当する必要のあるコードブロックがある場合は、中括弧を使用する必要があります。

これはloopsにも有効です

2
rajesh

通常、中括弧はステートメントのブロックを保持するためのものです。中括弧なしでは、if()ステートメントで最初の行のみが実行されます。 _{_で始まり_}_で終わるブロック全体ではありません

_if("pie" == "pie") {
   System.out.println("Executes if pie==pie");
   System.out.println("So does this");
}
_

そして

_if("pie" == "pie")
   System.out.println("Executes if pie==pie");
System.out.println("Executes, regardless of if pie is equal to pie");
_

ただし、2つのStringオブジェクトを比較する場合は、String.equals()メソッドを使用してください。この例は、1つの定数文字列をそれ自体と比較しているため、常に機能します。これは常に真です。

1
Aniket Inge

文の数が1に等しい場合、同じです。複数ある場合は、{}構文が必要です

1
Miguel Prz

いいえ、ifに応じて1つのステートメントを使用しても、それらの間に違いはありません。 ifに応答して2番目のステートメントを追加する場合は、中括弧が必要です。

0
Biswajit

私の2セント。中括弧なしのifステートメントの後に2行を書くことは、私が見たことのない間違いです。そうは言っても、あなたが働いている人は、あなたがここで引っ張っている手品を理解しない骨頭です。プライベートコード用にこのような楽しいものを保存しますが、プロや教室の設定で言われていることを行います。

これには、発生する可能性のある合理的な問題を示す実際の議論が1つあります。ご存知かもしれませんが、解析中にコードからすべてのインデントと余分な空白が削除されます。複数の1行elseステートメントの後に1行ifステートメントを使用しようとすると、問題が発生する場合があります。例えば:

if("cherry".equals("cherry"))
    if("pie".equals("pie"))
        System.out.println("Hurrah!");
else
    System.out.println("Rats!");

と区別がつかなくなる

if("cherry".equals("cherry"))
    if("pie".equals("pie"))
        System.out.println("Hurrah!");
    else
        System.out.println("Rats!");

そのような状況でも、自動タブ設定はどのifステートメントがelseが指しているのかを示す必要があります。よくします。

0
omikes

中括弧は、条件で大量のコードを実行する場合にのみ使用されます。中括弧を使用しない場合、if条件の後の最初のステートメントのみが実行されます。残りの行(最初のステートメントの下)は、if部分とは見なされません。

0

このifステートメントに中括弧を追加する場合:

if(++colorIndex == someColors.length)
            colorIndex = 0;
        setForeground(currentColor());
        repaint();

その後、それはもう機能しません。

だから、場合によっては問題になると思う。

0
Wim Van Geyt

If条件の後にステートメントが1つしかない場合は正常に機能します。

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("second statement");// this will not print

しかし、ここでは両方のステートメントが印刷されます

if("pie"== "pie")
{
System.out.println("Hurrah!");
System.out.println("second statement");
}

単一のステートメントを印刷する場合でも、以下のように使用することをお勧めします。

if("pie".equals("pie"))
   {
       System.out.println("Hurrah!");
       System.out.println("second statement");
   }
0
subodh

そして、中かっこを削除(または追加)することでメリット/デメリットが得られるかどうかを知りたいですか?

それらを常に追加することの利点は、追加する必要なく、後でコードブロックを簡単に拡張できることです。あなたが持っていると仮定します:

if("pie".equals("pie"))
    System.out.println("Hurrah!");

次に、コードの行を追加する場合は、中括弧を追加する必要があります。

if("pie".equals("pie")) {
    log.debug("I am here!");
    System.out.println("Hurrah!");
}

それらが既に存在する場合、カーソルを行の最後に置き、returnキーを押して新しいコードの追加を開始します。

1行の場合、技術的には違いはありませんが、多くのコード規約では、常にそれらを常に維持することを提案しています。 CheckStyle rule もあります。

0
Andreas Fester

問題ではない単一のステートメントの場合

if("pie"== "pie")
System.out.println("Hurrah!");

中括弧が必要な場合は、2つ以上のステートメントに対して

if("pie"== "pie"){
System.out.println("Hurrah!");
System.out.println("Hi!");
}

また、==ではなく.equals()を使用して比較します。

0
Raghunandan