1. 導入
Javaプログラミングにおいて、条件分岐は避けて通れない基本機能です。特に複数の値に対して処理を振り分ける際、if-else文を連ねるとコードが冗長になり、可読性が著しく低下します。そこで活躍するのがswitch文です。「なぜ今さらswitch文?」と思われるかもしれませんが、Java 17以降で導入されたswitch式(switch expressions)を正しく理解し、使いこなすためにも、そのルーツである「従来型のswitch文」の挙動を深く理解しておくことは、シニアエンジニアとして必須の教養です。
2. 基礎知識
switch文は、1つの変数の値に基づいて複数のコードブロックから1つを選択する制御フローです。if-elseと異なり、条件式が「等価判定(==)」に限定される代わりに、コードの構造が整理されるというメリットがあります。
重要なキーワードは以下の3つです。
・case: 比較対象の値を指定します。
・break: そのブロックの処理が終わった後に、switch文から脱出するために使用します。
・default: どのcaseにも該当しない場合の処理(if文でいうelse)を記述します。
3. 実装/解決策
従来型のswitch文で最も注意すべきは「フォールスルー(fall-through)」という挙動です。これは、特定のcaseに一致した際、break文がないと後続のcaseも順次実行されてしまう仕組みです。意図的に利用すれば複数の条件で同じ処理をさせることができますが、多くのバグの原因にもなります。現場では「breakを書き忘れていないか」を常に意識する必要があります。
4. サンプルプログラム
以下に、列挙型(Enum)を使用した標準的なswitch文の例を示します。
public class SwitchExample {
public enum Status { OPEN, IN_PROGRESS, CLOSED }
public static void main(String[] args) {
Status currentStatus = Status.IN_PROGRESS;
// 従来型のswitch文
switch (currentStatus) {
case OPEN:
System.out.println(“タスクを開始してください。”);
break; // breakがないと次のcaseも実行されるので注意
case IN_PROGRESS:
System.out.println(“現在進行中です。”);
break;
case CLOSED:
System.out.println(“タスクは完了しています。”);
break;
default:
// 予期せぬ値が渡された場合の安全策
System.out.println(“不明なステータスです。”);
break;
}
}
}
5. 応用・注意点
現場での開発において、従来型のswitch文を扱う際の注意点をまとめます。
・breakの漏れを防ぐ: 従来型のswitch文は、うっかりbreakを書き忘れてもコンパイルエラーになりません。これが不具合の温床になります。最新のJava環境であれば、可能な限りswitch式(-> 演算子を使用したもの)に置き換えることを強く推奨します。
・nullチェック: switch文にnullを渡すと、実行時にNullPointerExceptionが発生します。switch文に入る前に、必ずnullチェックを行う習慣をつけましょう。
・sealed classesとの組み合わせ: Java 17以降では、sealed classと組み合わせることで「網羅性チェック」が可能になります。すべてのサブクラスを網羅しているかコンパイラがチェックしてくれるため、従来型よりも圧倒的に安全な設計が可能です。
技術の進化に合わせてコードの書き方もアップデートしていくことが、保守性の高いシステムを作る秘訣です。まずは、今あるswitch文に不要なフォールスルーがないか、一度見直してみてはいかがでしょうか。

コメント