「意図的フォールスルー」は、簡単な条件まとめには便利ですが、規模が大きくなると可読性が下がるため、デザインパターン(特に戦略パターン)などを使って置き換えることが実務的にはよくあります。
フォールスルーを使った例(元コード)
switch (userType) {
case "ADMIN":
// 管理者と一般ユーザーの共通処理
logAccess(userType);
// ↓意図的フォールスルー
case "USER":
showMenu();
break;
case "GUEST":
showGuestMenu();
break;
default:
throw new IllegalArgumentException("不明なユーザー種別です");
}
Java🔍 問題点
"ADMIN"→"USER"に処理が落ちる(フォールスルー)ため、
意図を知らない人が読むとバグに見える。- 条件が増えると、どこからどこへ落ちていくかが複雑になる。
フォールスルーを使わずに同じ挙動を実現(リファクタ例)
パターン1:共通処理メソッドを呼び出す
switch (userType) {
case "ADMIN":
logAccess(userType);
showMenu();
break;
case "USER":
showMenu();
break;
case "GUEST":
showGuestMenu();
break;
default:
throw new IllegalArgumentException("不明なユーザー種別です");
}
Java→ シンプルで、処理の流れが明確。
共通処理が増えたら、共通メソッド化するだけで済みます。
🧠 パターン2:戦略パターン(Strategy Pattern)で整理
実務的にはこちらがよく使われます。
「ユーザーの種類ごとに異なる処理」をクラスに分けることで、switch文自体をなくすことができます。
コード例:
interface UserStrategy {
void execute();
}
class AdminUser implements UserStrategy {
public void execute() {
logAccess();
showMenu();
}
private void logAccess() { System.out.println("管理者アクセスログ"); }
private void showMenu() { System.out.println("管理者メニュー表示"); }
}
class NormalUser implements UserStrategy {
public void execute() {
showMenu();
}
private void showMenu() { System.out.println("ユーザーメニュー表示"); }
}
class GuestUser implements UserStrategy {
public void execute() {
showGuestMenu();
}
private void showGuestMenu() { System.out.println("ゲストメニュー表示"); }
}
class UserFactory {
static UserStrategy getStrategy(String userType) {
switch (userType) {
case "ADMIN": return new AdminUser();
case "USER": return new NormalUser();
case "GUEST": return new GuestUser();
default: throw new IllegalArgumentException("不明なユーザー種別");
}
}
}
public class Main {
public static void main(String[] args) {
String userType = "ADMIN";
UserStrategy strategy = UserFactory.getStrategy(userType);
strategy.execute();
}
}
Javaメリット
| 観点 | 戦略パターンの利点 |
|---|---|
| 可読性 | switchやフォールスルーが消える |
| 拡張性 | 新しいユーザー種別をクラス追加で対応 |
| テスト | 各戦略クラスを単体テスト可能 |
| バグ防止 | フォールスルーによる意図しない動作を排除 |
まとめ
| 方法 | 特徴 | 適用範囲 |
|---|---|---|
| フォールスルー | 短い処理で複数条件まとめたい時 | 小規模コード |
| 共通メソッド呼び出し | 可読性と意図の明確化 | 中規模コード |
| 戦略パターン | 拡張性と保守性を重視 | 大規模・業務システム |
