基本的なJavaのnewbostonsチュートリアルを見ながら、彼はこのようなifステートメントを行うことを教えてくれます(中括弧に注意してください)。
if("pie"== "pie"){
System.out.println("Hurrah!");
}
だから中かっこを削除してみた
if("pie"== "pie")
System.out.println("Hurrah!");
そして、それはまだ機能します!私はJavaが初めてなので、なぜそれが機能するのかわかりません。そして、中括弧を削除(または追加)することで利点/欠点が得られるかどうかを知りたいです。
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
}
}
(上記のリンクの例)
@rajeshが言うように、本文が単一のステートメントである場合、中括弧はオプションです。
とはいえ、単一のステートメントの場合でも中括弧を残すことは、一部のコーディングスタイルで推奨されます。これは、後でコードを変更するときにエラーが発生する可能性が低いためです。
if("pie"== "pie")
System.out.println("Hurrah!");
System.out.println("Tricked you");
2番目の印刷、Tricked you
は、実際にはif
にありません。インデントのために、そのように見えます。
ただし、それは単なるスタイルポイントであり、広く受け入れられているわけではありません。確かに、有能なプログラマーは両方のフォームを読むことができる必要があります。
いいえ、まったく違いはありません。中括弧のペアは、複数のステートメントを単一のステートメントにします。 if
、while
、for
などは、単一のステートメントを想定しています。ステートメントを1つだけ保護する必要がある場合は、中括弧は必要ありません。
ただし、多くのソフトウェアショップは、単一のステートメントに対してもブレースを使用することを主張しています。理由は次のようなエラーです。
if (x > 20)
x -= 7;
y -= 8;
上記の記述は誤解を招く可能性があります。インデントにより、両方の割り当てが保護されていると信じられますが、実際には最初の割り当てのみが保護されています。その理由は、Javaの空白は重要ではありません。文をインデントしても、プログラムのフロー全体での配置は変わりません。上記のようなエラーを見つけるのは非常に難しいため、そもそもそれらを防ぐルールは良い考えです。
これは、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);
ただし、後でコードを編集すると実際の危険が発生します。次のようなものを編集するのは比較的簡単です。
if (someCondition)
// do something
に
if (someCondition)
// do something
// do something else important
someConditionがtrueの場合にのみ、「他の重要なことをする」が実行されると考えます。インデントは誤解を招く:-)
ブラケットを使用すると、この危険はありません。
これには欠点があります。これまでに述べた答えは正しいです。しかし、物事のセキュリティの観点からは、いくつかの欠点があります。支払いチームで働いていたため、セキュリティはそのような決定を動機付けるはるかに強力な要因です。次のコードがあるとしましょう:
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 により、脆弱性として分類されます。
if
の後にステートメントが1つしかない場合、中括弧は必須ではありません。
if
条件に該当する必要のあるコードブロックがある場合は、中括弧を使用する必要があります。
これはloops
にも有効です
通常、中括弧はステートメントのブロックを保持するためのものです。中括弧なしでは、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に等しい場合、同じです。複数ある場合は、{}構文が必要です
いいえ、if
に応じて1つのステートメントを使用しても、それらの間に違いはありません。 if
に応答して2番目のステートメントを追加する場合は、中括弧が必要です。
私の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
が指しているのかを示す必要があります。よくします。
中括弧は、条件で大量のコードを実行する場合にのみ使用されます。中括弧を使用しない場合、if条件の後の最初のステートメントのみが実行されます。残りの行(最初のステートメントの下)は、if部分とは見なされません。
このifステートメントに中括弧を追加する場合:
if(++colorIndex == someColors.length)
colorIndex = 0;
setForeground(currentColor());
repaint();
その後、それはもう機能しません。
だから、場合によっては問題になると思う。
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");
}
そして、中かっこを削除(または追加)することでメリット/デメリットが得られるかどうかを知りたいですか?
それらを常に追加することの利点は、追加する必要なく、後でコードブロックを簡単に拡張できることです。あなたが持っていると仮定します:
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 もあります。
問題ではない単一のステートメントの場合
if("pie"== "pie")
System.out.println("Hurrah!");
中括弧が必要な場合は、2つ以上のステートメントに対して
if("pie"== "pie"){
System.out.println("Hurrah!");
System.out.println("Hi!");
}
また、==ではなく.equals()を使用して比較します。