前提
Javaの学習中にふと思ったのですが、
if文について例となるサイトはいくつもありますが、例となっているものは、
if-else文か、if-else if - else文が多く、if-else ifの例があまり出てきません。
if-else if文は、一般的に使用しないのでしょうか。
下記の例で、args[0]に必ず"1"か"2"が代入されるケースだと、書き方①(if-else if)と②(if-else(コメントで補記))のどちらが望ましいでしょうか。
当たり前すぎる質問かもしれませんが、お答えいただけると幸いです。
該当のソースコード
Java
1public class Main { 2 3 private static final String OPTION1 = "1"; 4 private static final String OPTION2 = "2"; 5 6 public static void main(String[] args) { 7 String answer = args[0]; 8 9 // 書き方① 10 if (OPTION1.equals(answer)) { 11 System.out.println("〇"); 12 } else if (OPTION2.equals(answer)) { 13 System.out.println("×"); 14 } 15 16 // 書き方② 17 if (OPTION1.equals(answer)) { 18 System.out.println("〇"); 19 // answerが2の場合 20 } else { 21 System.out.println("×"); 22 } 23 } 24}
以下のような質問にはグッドを送りましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 間違っている
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答5件
4
要件次第です。
「外部からの任意の入力は信用しない」というのが原則です。
故に、バリデーション(入力値検査)を行って、意図しない外部入力を受け入れないように配慮します。
「1以外は全部2(×)とする」という仕様なのであれば、書き方②のほうで良いでしょう。
そうでないなら書き方①にelseを入れるか、それより前に「1でも2でもない場合は無効」という判定を入れて戻し(これがバリデーション)、アプリケーションを終了させるか再入力を促します。
(書き方①だけだと不十分になる可能性は高い)
投稿2022/10/29 19:46
編集2022/10/29 19:47総合スコア79935
2
ベストアンサー
else if
を使えばその他の場合をさらに細分化できますが、重要なのは、細分化ではなく全ての場合を尽くすことです。この例で、ansewerの取りうる値の集合は何でしょうか。
answer = {1,2}
answer = {1,2,...}
最初の例だと全てを尽くす条件は以下のようになります
- 1か、それ以外
- 1か、2
2番目の例は、1,2以外の要素がある(後で追加されるかも知れない)ので、全てを尽くす条件は以下のようになります
- 1か、それ以外
- 1か、2か、それ以外
全ての場合を尽くさないと、漏れた値に対応できません。また、分割する集合に共通部分があると、バグやデッドコードを生じることがあります。
条件分岐はさまざまな書き方ができますが、 プログラミング言語に関係なく、次のように記述してください。
- 全ての場合を尽くしていること
- 条件分岐で分割する集合は互いに素(共通部分がない)こと
switch
を使ってみます。default:を付けて全てを尽くしてください。
Java
1 // 書き方③ 2 if (answer == null) { 3 // nullを除外 4 throw new NullPointerException(); 5 } 6 switch (answer) { 7 case OPTION1: 8 // ... 9 break; 10 case OPTION2: 11 // ... 12 break; 13 default: 14 assert false; 15 }
投稿2022/10/30 00:17
編集2022/11/01 20:41総合スコア969
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
2022/10/30 04:43
2
"必ず" をどこまで保証出来るかです。
else を書くだけの手間を省いた所為で "必ず" が守られなかった場合に問題が発生したら、コードを書いた本人は "仕様通りです" と言っても顧客の信用は無くすでしょう。
仕様通りだけでは無く、仕様通りで無い状態になる可能性も含めてコードを書いておいたほうが保険にはなります。
投稿2022/10/29 16:37
総合スコア10746
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
1
本来は
Java
1if( 条件式A ){ 2 // 処理A 3}else if( 条件式B ){ 4 // 処理B 5}else{ 6 // 処理C 7}
で一つだと思います。でも仕様によってはelseもelse ifも必要が無い場合もあります。
たとえば bool isWritten という変数があり、これの値がtrueのときに処理Aをそれ以外なら処理Bをする場合、
isWritten == true -> 処理A
isWritten == false -> 処理B
ですけど、これを上記の基本的なものに埋め込むと
Java
1if( isWritten == true ){ 2 // 処理A 3}else if( isWritten == false ){ 4 // 処理B 5}else{ 6 // 処理C 7}
となります。ですがbool型は trueかfalseしかありません。最初のif( isWritten == true )
を満たさないのならもう一方の falseになっているはずです。二択のうちの一つが存在しないならもう、一択しかないですね。
ということはisWritten == true
を満たさない時点でisWritten == false
も決まったようなものです。
(言語によってはundefinedとかのような値になったりしますが、常に何らかの値が入っているという前提で)
trueじゃないならfalse, falseじゃないならtrueという感じなのでelseが出てくる理由はないですよね。
だって書いてもそこに到達するものないじゃないですか。
仮にbool isWritten = false;
だとしたら、if( isWritten == true )
は満たさないので、次のelse ifに。
else if( isWritten == false )
は満たしますからelseには行きません。
でも、先ほど書いたように trueならfalseを満たさず、falseならtrueを満たさないという排他的な関係なので、
「else ifではなくelseで対応可能」となります。
なので
Java
1if( isWritten == true ){ 2 // 処理A 3}else{ 4 // 処理B 5}
と書けますね。isWritten == true を満たさないなら 値はfalseってことは確定だからelseでも対応可能ですね。
で、int型で複数の値になる場合 ( 選択肢が { 1, 2, 3, 4, ... } と複数あるとか )は else ifを使って分岐させる。
Java
1int a = 10; 2if( a == 1 ){ 3 // 処理A 4}else if( a == 2 ){ 5 // 処理B 6}else if( a == 3 ){ 7 // 処理C 8}...{ 9... 10}else{ 11 // 処理X 12}
でも変数に入っている値は「常に 1≦値≦10でないといけない」場合でもたとえばa = 130のような範囲外の値になっていたりすることもある。
そうなるとelse ifだけでは足りない。やるとしたらもう人間の手には負えません。
だって -1304213 とかみたいな値を入れられる可能性があるんですよ? マイナスだけじゃなくてプラスも。
面倒ですね。ということでelseを使って「今までの条件に該当しないなら」つまり、範囲外の値ならとする。
そしてこの値が文字列だとどうでしょうか?「はろー」「ぐっばい」…といろんな候補があるのでその分岐のためにelse ifを使う。
だから基本は最初に挙げたelse ifとelseも使ったヤツで、必要な分使っていけばいいということです。
投稿2022/10/30 01:36
総合スコア4953
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
1
else if
は高い拡張性を有する。
投稿2022/10/29 17:23
総合スコア481
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
こちらの回答が複数のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。
こちらの回答が他のユーザーから「スパムと見受けられる内容を含む回答」という指摘を受けました。
関連した質問
解決済
回答1
クリップ0
更新
2023/01/19
javaの複数の異なる規則によって文字を置き換えたいです。
解決済
回答2
クリップ0
更新
2023/01/24
Javaのtry構文内で変数が参照されない
解決済
回答1
クリップ0
更新
2023/01/23
編集ボタンを押したらidを取得し出力する
解決済
回答3
クリップ1
更新
2023/01/22
javaのcsvファイルの読み込みとGUIについて
解決済
回答1
クリップ0
更新
2023/01/23
Progateで作成したプログラムのエラー
解決済
回答1
クリップ0
更新
2023/01/27
リストの1行ごとに背景を変えたい
解決済
回答1
クリップ1
更新
2023/01/26
jAVA スキャナーのによる出力表示
解決済
回答4
クリップ0
更新
2023/01/27
for文が機能しなくて困っています
同じタグがついた質問を見る
Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/10/30 03:26
2022/10/30 04:01