実務型メニューアプリ(サブメニュー+疑似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;
}
}
Java5. 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;
}
}
}
}
Java6. 特徴・実務ポイント
| ポイント | 解説 |
|---|---|
| Enum管理 | メニュー番号と表示名を一元管理 |
| Service分離 | 入力チェック・DB操作・表示を責務ごとに整理 |
| サブメニュー対応 | 購入・検索は Service 内でサブループを管理 |
| 疑似DB | 実務ではDBに置き換えるだけで即対応可能 |
| 入力例外対応 | try-catchで不正値を防ぐ |
| 拡張性 | 新メニュー追加も Enum + Service に追記するだけでOK |
7. 発展案
- サブメニューで購入数量入力 → 購入個数を管理
- 在庫管理 → ProductDBに数量を追加して在庫管理
- ファイル保存 → 購入履歴を CSV や JSON で保存
- ユニットテスト → Service メソッドのテストを追加
💡 この構造があれば、Mainは入力+ループのみ、Serviceは処理専任、データはProductDBで管理 という実務標準設計に近い形になります。
