1. 導入:なぜ無限ループを理解する必要があるのか
プログラミングにおいて「無限ループ」は、一歩間違えればアプリケーションをフリーズさせる危険な存在です。しかし、適切に制御すれば、サーバーの待機処理やイベントループなど、極めて強力な武器になります。本稿では、無限ループの書き方と、それらを安全かつモダンに制御するためのJavaの分岐構造について解説します。
2. 基礎知識:無限ループの正体
Javaにおいて無限ループを作成する主な方法は、while(true) と for(;;) です。どちらも「条件式が常に真(true)である」という状態を作り出し、明示的に break 文が実行されるまで処理を続行させます。
これに組み合わせる制御フローとして、従来のif-elseに加え、Java 14以降で導入されたswitch式(switch expressions)や、特定の階層構造を制限するsealed classes(シールクラス)を活用することで、ループ内の複雑なロジックを簡潔に記述できるようになりました。
3. 実装/解決策:ループからの脱出と制御
無限ループを安全に使う鉄則は「必ず終了条件(break)を設けること」です。また、ループ内の分岐処理をswitch式で行うと、網羅性のチェック(すべてのケースが考慮されているか)がコンパイラによって行われるため、バグが大幅に減ります。
4. サンプルプログラム
以下のコードは、コマンド入力を受け付け、特定の入力で終了する無限ループの例です。
import java.util.Scanner;
public class LoopExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 無限ループの開始(for(;;)でも可)
while (true) {
System.out.println("コマンドを入力してください (start/stop/exit): ");
String input = scanner.nextLine();
// switch式を使用して入力を判定
String message = switch (input) {
case "start" -> "処理を開始します。";
case "stop" -> "処理を停止します。";
case "exit" -> "終了します。";
default -> "不明なコマンドです。";
};
System.out.println(message);
// 終了条件:exitが入力されたらループを抜ける
if ("exit".equals(input)) {
break;
}
}
scanner.close();
}
}
5. 応用・注意点:現場でのベストプラクティス
現場で無限ループを扱う際は、以下の点に注意してください。
・無限ループの安全性:ループ内では必ずスリープ処理(Thread.sleep)やブロッキングI/Oを入れ、CPUを100%使用し続ける「ビジーウェイト」を避けてください。
・Sealed Classesとの連携:複雑な状態遷移を扱う場合、sealed classで定義した型をswitch式で網羅的に判定することで、将来的な機能追加時の「実装漏れ」をコンパイルエラーとして検知できます。
・可読性の向上:無限ループが深くなる場合は、そのループ自体を別メソッドに切り出し、責務を明確に分離しましょう。
適切な制御フローを組み合わせることで、無限ループは「危険なバグの温床」から「堅牢なシステム構成要素」へと変わります。ぜひ日々の開発に取り入れてみてください。

コメント