Java | 逆順処理でよくあるバグ集

Java Java
スポンサーリンク

逆順処理のリファクタリング例

では「逆順処理を含むコードをレビューで“読みやすくする”ためのリファクタリング例」を紹介します。


例1: 境界条件が分かりにくい for文

悪いコード(レビューで指摘されやすい)

for (int i = list.size() - 1; i > 0; i--) {
    System.out.println(list.get(i));
}
Java
  • 問題点: i > 0 だと list.get(0) が出力されない
  • レビューコメント例: 「境界条件が off-by-one になっている」

良いコード(リファクタリング後)

for (int i = list.size() - 1; i >= 0; i--) {
    System.out.println(list.get(i));
}
Java

👉 >= 0 にすることで 全要素を確実に処理できる。


例2: foreach で逆順を無理に書こうとする

悪いコード

for (String s : list) {
    // foreach では逆順にできないので混乱
}
Java

良いコード

List<String> reversed = new ArrayList<>(list);
Collections.reverse(reversed);

for (String s : reversed) {
    System.out.println(s);
}
Java

👉 意図が明確で、インデックス管理不要。


例3: Stream での境界条件ミス

悪いコード

IntStream.range(0, list.size())
         .map(i -> list.size() - i) // ❌ IndexOutOfBounds
         .forEach(i -> System.out.println(list.get(i)));
Java

良いコード

IntStream.range(0, list.size())
         .map(i -> list.size() - 1 - i)
         .mapToObj(list::get)
         .forEach(System.out::println);
Java

👉 size() - 1 - i とすることで 正しい逆順インデックスになる。


例4: 履歴やログの逆順処理

悪いコード

for (int i = logs.size(); i >= 0; i--) { // ❌ IndexOutOfBounds
    System.out.println(logs.get(i));
}
Java

良いコード

for (int i = logs.size() - 1; i >= 0; i--) {
    System.out.println(logs.get(i));
}
Java

👉 size() ではなく size() - 1 から開始するのが鉄則。


レビューで褒められるポイント

  • 境界条件を正しく書く (>= 0)
  • foreach + Collections.reverse で意図を明確に
  • Stream では size() - 1 - i を忘れない
  • 「最新から処理したい」意図が一目で分かる書き方にする

💡 まとめると、逆順処理は「境界条件の1ズレ」と「無理な書き方」がバグの温床です。
レビューで褒められるのは、シンプルで意図が伝わるコードです。

タイトルとURLをコピーしました