1. 導入:なぜ今さらdo-whileなのか?
Javaエンジニアであればfor文やwhile文は毎日使うはずですが、do-while文の出番は意外と少ないものです。「一度は必ず実行してから条件判定する」という特性は、実は特定の業務要件において非常に強力な武器になります。本記事では、do-whileの適切な使いどころと、現代のJava開発におけるループ制御の選び方を解説します。
2. 基礎知識:do-while文の仕組み
do-while文は、ループの最後に条件判定を行う「後判定ループ」です。
while文が「条件を満たしていなければ一度も実行されない」のに対し、do-while文は「最低でも一度はブロック内のコードが実行される」ことが保証されます。
主な用途は、ユーザー入力のバリデーションや、リソースの再試行ロジック、あるいは「とりあえず一度処理して、結果を見てから継続するか決める」という処理フローです。
3. 実装と解決策:ループの選択基準
実務では以下の基準でループを選択するのが定石です。
・for文:回数が決まっている、またはコレクションのインデックスを操作する場合。
・enhanced-for文(拡張for文):ListやSetを走査する場合(最も可読性が高い)。
・while文:条件に応じて継続・終了を制御したい場合。
・do-while文:「まずは1回実行し、その結果で継続判定したい」場合。
4. サンプルプログラム
以下のコードは、外部からの入力やAPIリクエストにおいて、成功するまで(または規定回数まで)リトライを繰り返す実用的なパターンです。
import java.util.Scanner;
public class RetrySample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int maxRetries = 3;
int count = 0;
boolean isSuccess = false;
// do-whileを使用:まずは一度実行し、成功しなければリトライする
do {
count++;
System.out.println(count + "回目の試行中...");
// ここに外部API呼び出しやDB操作などの処理が入る
System.out.print("処理を成功させますか? (y/n): ");
String input = scanner.nextLine();
if ("y".equalsIgnoreCase(input)) {
isSuccess = true;
System.out.println("処理成功!");
} else {
System.out.println("処理失敗...");
}
} while (!isSuccess && count < maxRetries); // 成功していない、かつリトライ上限に達していない場合のみループ
if (!isSuccess) {
System.out.println("規定回数に達したため終了します。");
}
scanner.close();
}
}
5. 応用・注意点:現場で陥りやすいバグ
do-whileを使う際、特に注意すべき点が2つあります。
・無限ループのリスク
while文と同様ですが、終了条件が意図せず常にtrueになるようなコードは致命的です。必ずループ内で「終了条件に寄与する変数(この場合はcountやisSuccess)」が更新されているか確認してください。
・可読性の低下
「一度実行する」という要件でない限り、基本的にはwhile文を使う方がJavaの慣習として読みやすくなります。無理にdo-whileを使うと、コードの読み手は「なぜ一度実行が必須なのか?」を考える必要が生じます。
・関数型インターフェースとの比較
Java 8以降、繰り返し処理はStream APIなどで記述する機会が増えました。複雑なループ制御が必要な場合、ループの中にロジックを詰め込むのではなく、メソッドを切り出して再帰や関数型の手法で解決できないか検討することも、シニアエンジニアとしての重要な視点です。

コメント