実務型メニューアプリ(Enum + Service + switch + ループ)
では、Enum+Service+switch+入力ループ を組み合わせた、実務型のユーザーメニューアプリを作ります。
ポイントは 安全性と拡張性を重視 した設計です。
1. Enumでメニューを管理
public enum MenuOption {
SHOW(1, "商品一覧を見る"),
SEARCH(2, "商品を検索する"),
PURCHASE(3, "購入手続きへ進む"),
EXIT(0, "終了する");
private final int code;
private final String description;
MenuOption(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
// コードからEnumを取得するメソッド
public static MenuOption fromCode(int code) {
for (MenuOption option : values()) {
if (option.getCode() == code) {
return option;
}
}
return null; // 無効なコードの場合
}
}
Java💡 ポイント:
- 数字と表示名をセットで管理
fromCode()で入力値を安全にEnumに変換- 無効値のチェックが簡単になる
2. Serviceクラス(処理を担当)
public class MenuService {
public void showItems() {
System.out.println("→ 商品一覧を表示します。\n");
}
public void searchItem(String keyword) {
System.out.println("→ 「" + keyword + "」を検索しました。\n");
}
public void purchase() {
System.out.println("→ 購入手続きに進みます。\n");
}
}
Java💡 ポイント:
- 各メニューの処理は Service に集約
- Main は「入力・ループ・switch制御」のみ
3. Mainクラス(入力とswitch制御)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
MenuService service = new MenuService();
while (true) {
// メニュー表示
System.out.println("=== メニュー ===");
for (MenuOption option : MenuOption.values()) {
System.out.println(option.getCode() + ": " + option.getDescription());
}
System.out.print("番号を選んでください: ");
int input = -1;
try {
input = scanner.nextInt();
scanner.nextLine(); // 改行消去
} catch (Exception e) {
scanner.nextLine(); // 不正入力クリア
System.out.println("→ 数字を入力してください\n");
continue;
}
MenuOption choice = MenuOption.fromCode(input);
if (choice == null) {
System.out.println("→ 無効な番号です\n");
continue;
}
switch (choice) {
case SHOW:
service.showItems();
break;
case SEARCH:
System.out.print("検索したい商品名を入力してください: ");
String keyword = scanner.nextLine();
service.searchItem(keyword);
break;
case PURCHASE:
service.purchase();
break;
case EXIT:
System.out.println("→ プログラムを終了します。");
scanner.close();
return; // プログラム終了
}
}
}
}
Java4. 特徴・実務ポイント
| ポイント | 解説 |
|---|---|
| Enum管理 | メニュー番号と表示名を一元管理、安全にswitch文へ渡せる |
| Serviceクラス分離 | 処理内容の変更がMainに影響せず安全 |
| 入力例外処理 | try-catchで文字入力や不正値を防ぐ |
| 拡張性 | 新しいメニューを追加しても Enum と Service に追記するだけでOK |
| 可読性 | Mainは入力と分岐のみ、処理はService、構造が明確 |
5. 発展アイデア(さらに実務寄り)
- DB連携
- 商品一覧や検索をデータベースから取得するように変更
- ログ出力
- 処理履歴を SLF4J などのロガーで記録
- メニュー多段階化
- サブメニューを Enum + Service で作り、階層構造を管理
- ユニットテスト
- Service メソッドを JUnit でテスト可能にして品質向上
まとめ
- Enum + Service + switch の組み合わせで 安全で保守性の高いメニュー設計 が可能
- 実務でも「Mainは最小限」「処理はService」「設定はEnum」と整理するのが基本
