何個でも、必要なら作れば良いのでは無いでしょうか。
問題があるかどうかは環境に依る部分が大きいと思いますので、やってみれば分かることです。
でも私なら、型やタイプ(ポケモンやらないので違いが分かりません)はともかく、 Move 自体は enum にはしないで csv から読んでの普通のクラス/オブジェクトにするでしょう。技が何百種類あろうがある瞬間に同時に必要なのは幾つかだけなら、その都度オブジェクトを生成・削除すれば資源は最小限で済むはずです。そして今すぐそこまでの機能が必要な訳では無さそうですので、技オブジェクトの取得部分を取り替えられるようにしておいて、今は適当に返すようにします。
なお、 enum (の定義自体)が沢山あるのと enum のメンバ(オブジェクト)が沢山あるのは違いますので、表現はご注意された方が良いと思います。
csv 等から enum を import する場合は getById メソッドのようなもので enum に戻すことになるので、そこで不正値なら例外を発すれば、基本的な型の安全は保てます。(null を返すのは発見が遅れるので好ましくないと考えます。)
「Species」に151種の列挙定数を、「Move」に165種の列挙定数を、「Type」に15種
ということですが、上で書いたのと同じく私なら Species と Move は enum にはしません。 Type は enum が妥当と考えます。
ポケモンを P(p)okemon, 技を A(a)ction としてやってみると以下な感じ。
pokemon.csv
csv
1ポケモン1, たいあたり, みずでっぽう, null
2ポケモン2, たいあたり, ひのこ, なきごえ
action.csv
csv
1たいあたり, NORMAL, PHYSICAL, 50, 30, THREE
2みずでっぽう, WATER, SPECIAL, 10, 10, THREE
3ひのこ, FIRE, SPECIAL, 20, 20, THREE
4つるのむち, GRASS, SPECIAL, 30, 30, THREE
5なきごえ, NORMAL, STATUS, 40, 40, THREE
Pokemon.java
java
1import java.io.*;
2import java.util.HashMap;
3import java.util.Map;
4
5public class Pokemon {
6 public static void main(String[] args) throws IOException {
7 Map<String,Action> actionMap = Action.readCsv("action.csv");
8 Map<String,Pokemon> map = Pokemon.readCsv("pokemon.csv", actionMap);
9 for(Pokemon p : map.values()) System.out.println("pokemon="+p);
10 }
11
12 private static Map<String,Pokemon> readCsv(String filename, Map<String,Action> actionMap) throws IOException {
13 Map<String,Pokemon> map = new HashMap<>();
14 try(BufferedReader r = new BufferedReader(new FileReader(filename))) {
15 for(String line; (line=r.readLine()) != null; ) {
16 String[] tokens = line.split(", *");
17 if(tokens.length != 4) throw new IOException("format error: line="+line);
18 if(map.containsKey(tokens[0])) throw new IOException("overloaded: line="+line);
19 Pokemon p = new Pokemon(tokens[0]);
20 map.put(tokens[0], p);
21 for(int i=0; i<3; i++) {
22 if(tokens[1+i].equals("null")) continue;
23 Action action = actionMap.get(tokens[1+i]);
24 if(action == null) throw new IOException("action not found: line="+line);
25 p.actions[i] = action;
26 }
27 }
28 }
29 return map;
30 }
31
32 final String name;
33 private Action[] actions = new Action[3];
34
35 private Pokemon(String name) {
36 this.name = name;
37 }
38 @Override
39 public String toString(){
40 return super.toString()+"["+name+","+actions[0]+","+actions[1]+","+actions[2]+"]";
41 }
42}
43
44enum Type {
45 NORMAL, WATER, FIRE, GRASS
46}
47enum Category {
48 PHYSICAL, SPECIAL, STATUS
49}
50enum Priority {
51 ONE, TWO, THREE
52}
53
54class Action {
55 static Map<String,Action> readCsv(String filename) throws IOException {
56 Map<String,Action> map = new HashMap<>();
57 try(BufferedReader r = new BufferedReader(new FileReader(filename))) {
58 for(String line; (line=r.readLine()) != null; ) {
59 String[] tokens = line.split(", *");
60 if(tokens.length != 6) throw new IOException("format error: line="+line);
61 if(map.containsKey(tokens[0])) throw new IOException("overloaded: line="+line);
62 try {
63 map.put(tokens[0], new Action(tokens[0],
64 Type.valueOf(tokens[1]),
65 Category.valueOf(tokens[2]),
66 Integer.parseInt(tokens[3]),
67 Integer.parseInt(tokens[4]),
68 Priority.valueOf(tokens[5])));
69 } catch(IllegalArgumentException e) {
70 throw new IOException("format error: line="+line, e);
71 }
72 }
73 }
74 return map;
75 }
76
77 final String name; // 名
78 final Type type; // タイプ
79 final Category category; // 型(ぶつり/とくしゅ/へんか)
80 final int power; // 威力
81 final int pp; // 使用最大回数
82 final Priority priority; // 優先度
83
84 private Action(String name, Type type, Category category, int power, int pp, Priority priority) {
85 this.name = name;
86 this.type = type;
87 this.category = category;
88 this.power = power;
89 this.pp = pp;
90 this.priority = priority;
91 }
92
93 @Override
94 public String toString(){
95 return super.toString()+"["+name+","+type+","+category+","+power+","+pp+","+priority+"]";
96 }
97}
実行
pokemon=Pokemon@85ede7b[ポケモン1,Action@5674cd4d[たいあたり,NORMAL,PHYSICAL,50,30,THREE],Action@63961c42[みずでっぽう,WATER,SPECIAL,10,10,THREE],null]
pokemon=Pokemon@65b54208[ポケモン2,Action@5674cd4d[たいあたり,NORMAL,PHYSICAL,50,30,THREE],Action@1be6f5c3[ひのこ,FIRE,SPECIAL,20,20,THREE],Action@6b884d57[なきごえ,NORMAL,STATUS,40,40,THREE]]
enum は端的にはメソッド呼び出しで範囲のあるパラメータの指定間違いをコンパイルエラーで取り易くするというだけです。
プログラムが扱う(ファイル等から取得する)データの値の範囲をコンパイルエラーとして取り除くことは出来ません。
結局プログラムを動作させなければ分からないことですので、上に書いたようにファイルの読み込み時にそれぞれの値をチェックするというのは enum でも普通の class でも同じですし、普通のオブジェクトに保存した値を変更できなくすれば読み込んだ後に不正値になる心配もありません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。