前提・実現したいこと
Java初心者です. 初投稿で, 見苦しい点もあると思いますがよろしくお願いします.
Javaでマジックナンバを防ぐために, enumを実装したいのですが,
その際に異なる列挙子に重複する定数を扱う方法はありますか?
追記: 具体的には, コンストラクタで同じフィールド変数に書き込んでいるので, 引数から列挙子を逆引きするときに(parseメソッド)目的の列挙子をうまく呼べないという事象が発生している.
マジックナンバを単にstatic final などで保持するよりも, 型の安全性があると伺ったので試用しましたが,
同じ値の定数に対してenumは有効ではないのでしょうか?
該当のソースコード(やりたいことのイメージ)
画面入力から受け取った値をStringで保管し, switchで画面遷移させたいとき
java
1enum Type 2{ 3 メニュー1("1"), 4 メニュー2("2"), 5 りんご("1"), // ←このような例 6 ぶどう("2"); 7 戻る("e"), 8 9 // getter, setter , コンストラクタ, etc..(省略) 10 11 // String to Object 12 public static Type parse(String stat) 13 { 14 for (Type st : values()) 15 { 16 if (st.field.equals(stat)) 17 { 18 return st; 19 } 20 } 21 throw new RuntimeException("Unknown type code:" + stat); 22 } 23} 24 // 画面入力用 ↓ 25static Scanner sc = new Scanner(System.in); 26 27public static String scanner() 28 { 29 String in = sc.nextLine(); 30 return in; 31 } 32public static void closeScanner() 33 { 34 sc.close(); 35 } 36
クライアント側
メニュー画面
java
1while(true){ 2 try 3 { 4 switch (Type.parse(scanner())) 5 { 6 case メニュー1: 7 //画面遷移先呼び出し処理 (省略) 8 case メニュー2: 9 //同上 10 case 戻る: 11 closeScanner(); 12 System.out.print("終了しました"); 13 System.exit(0); 14 default: 15 break; 16 } 17 } 18 catch (RuntimeException e) 19 { 20 System.err.println("入力は不正です.もう一度入力してください"); 21 } 22}
画面遷移先
java
1// メニュー1内とする 2try 3{ 4 switch (Type.parse(scanner())) 5 { 6 case りんご: 7 // りんごに対する処理 8 case ぶどう: 9 case 戻る: 10 default: 11 break; 12 } 13} 14catch (RuntimeException e) 15{ 16 System.err.println("入力は不正です.もう一度入力してください"); 17 controllInquryDisplay(); 18}
###イメージ
サンプルメニュー
1) メニュー1
2) メニュー2
該当の項目を入力してください
ユーザ入力 : 1
メニュー1
- りんご
- ぶどう
該当の項目を入力してください
ユーザ入力 : 1
上記のような動作イメージです
現在は, メニュー1で1を入力すると(当然ですが) case りんご: に入りません
######候補案
- enumを複数用意する
ex) enum Type1{}, enum Type2{}, ...
2. 素直に static final なメンバ変数を使う
など思いつきましたが, 少し迷走してる気もします.
回答3件
あなたの回答
tips
プレビュー