Java | ミニアプリ:メニュー選択プログラム(switch文)

Java Java
スポンサーリンク

実務型メニューアプリ(サブメニュー+疑似DB検索)

では、先ほどの Enum + Service + switch + 入力ループ をベースに、さらに サブメニュー + 疑似DB検索機能 を追加して、完全実務型テンプレート に仕上げます。


サブメニュー設計

  • メインメニューに加えて「購入メニュー」「検索メニュー」をサブメニュー化
  • サブメニューも Enum で管理
  • Main クラスでは「メインループ」と「サブメニューループ」を制御

2. 疑似データ(商品のリスト)

import java.util.ArrayList;
import java.util.List;

public class ProductDB {
    private List<String> products;

    public ProductDB() {
        products = new ArrayList<>();
        products.add("りんご");
        products.add("ばなな");
        products.add("みかん");
        products.add("ぶどう");
        products.add("メロン");
    }

    public List<String> getAllProducts() {
        return products;
    }

    public List<String> search(String keyword) {
        List<String> result = new ArrayList<>();
        for (String p : products) {
            if (p.contains(keyword)) {
                result.add(p);
            }
        }
        return result;
    }
}
Java

💡 実務感:DBの代わりに List で商品管理、検索もメソッド化。


3. Serviceクラス(サブメニュー対応)

import java.util.List;
import java.util.Scanner;

public class MenuService {
    private ProductDB db = new ProductDB();

    public void showItems() {
        System.out.println("→ 商品一覧を表示します。");
        List<String> products = db.getAllProducts();
        for (String p : products) {
            System.out.println(" - " + p);
        }
        System.out.println();
    }

    public void searchItem(Scanner scanner) {
        System.out.print("検索したい商品名を入力してください: ");
        String keyword = scanner.nextLine();
        List<String> results = db.search(keyword);

        if (results.isEmpty()) {
            System.out.println("→ 該当商品は見つかりませんでした。\n");
        } else {
            System.out.println("→ 検索結果:");
            for (String p : results) {
                System.out.println(" - " + p);
            }
            System.out.println();
        }
    }

    public void purchase(Scanner scanner) {
        System.out.println("購入メニューに進みます。");
        showItems();
        System.out.print("購入したい商品名を入力してください: ");
        String product = scanner.nextLine();
        if (db.getAllProducts().contains(product)) {
            System.out.println("→ 「" + product + "」を購入しました。\n");
        } else {
            System.out.println("→ 商品が見つかりません。\n");
        }
    }
}
Java

💡 ポイント:

  • Scanner を引数にして入力を共通化
  • 商品検索・購入をサブメニューとして扱う
  • 実務的に「DB参照+入力チェック+結果表示」をセット化

4. 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; }

    public static MenuOption fromCode(int code) {
        for (MenuOption option : values()) {
            if (option.getCode() == code) return option;
        }
        return null;
    }
}
Java

5. Mainクラス(サブメニュー対応ループ)

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:
                    service.searchItem(scanner);
                    break;
                case PURCHASE:
                    service.purchase(scanner);
                    break;
                case EXIT:
                    System.out.println("→ プログラムを終了します。");
                    scanner.close();
                    return;
            }
        }
    }
}
Java

6. 特徴・実務ポイント

ポイント解説
Enum管理メニュー番号と表示名を一元管理
Service分離入力チェック・DB操作・表示を責務ごとに整理
サブメニュー対応購入・検索は Service 内でサブループを管理
疑似DB実務ではDBに置き換えるだけで即対応可能
入力例外対応try-catchで不正値を防ぐ
拡張性新メニュー追加も Enum + Service に追記するだけでOK

7. 発展案

  1. サブメニューで購入数量入力 → 購入個数を管理
  2. 在庫管理 → ProductDBに数量を追加して在庫管理
  3. ファイル保存 → 購入履歴を CSV や JSON で保存
  4. ユニットテスト → Service メソッドのテストを追加

💡 この構造があれば、Mainは入力+ループのみ、Serviceは処理専任、データはProductDBで管理 という実務標準設計に近い形になります。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました