質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.83%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

意見交換

クローズ

[Java]ゲームのデータをEnumでどこまで管理すべきか

perfectibility
perfectibility

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

3回答

0グッド

0クリップ

1145閲覧

投稿2023/03/14 16:14

編集2023/03/15 12:03

テーマ、知りたいこと

  • Enumを沢山(1つのenumクラスに100個とか)作っても負荷にならないか。
    • 具体的には、Enumは「Species(ポケモンの種類)」「Move(わざ)」「Type(タイプ)」等があり、「Species」に151種の列挙定数を、「Move」に165種の列挙定数を、「Type」に15種の列挙定数を作ろうと思っています。
  • 不正な値が入り込めないようにしたいが、csvファイルなどを使ってもEnumと同じくらいの型安全?を保障できるのか。

背景、状況

Javaを独学中で、アウトプットとモチベーション維持の為にポケモン(赤青~BW2くらいの物)を作っていますが、本格的なのを作るにはポケモンやわざが多く、赤青でも100種以上あった筈なのでデータベース化を考えています。
今はポケモンも御三家のみでわざもたいあたり位なのでEnumで管理しているのですが今後本格的に作っていくと大幅に増えるのが確実なのでデータベース化を考えています。
ソシャゲみたいに追加コンテンツはしないのでcsvファイル化が1番良いかと思っています。
プログラミングミスやバグによる不正な値の入力を防ぎたいのでenumを使っていますが、わざと種類だけでそれぞれ50~100個近くのenumクラスが出来てしまうのですが、それは動作が重くなったり、負荷になったりしませんか?
上手くcsvファイルなどと使い分ける事は出来るのでしょうか?

現状のわざの管理状態

Java

1public enum Move { 2// 技名(日本語名, タイプ, 型(ぶつり/とくしゅ/へんか), 威力, PP, 優先度(基準3)) 3 TACKLE("たいあたり", NORMAL, Physical, 50, 30, THREE), 4 WATERGUN("みずでっぽう", WATER, SPECIAL, , , THREE), 5 EMBER("ひのこ", FIRE, SPECIAL, , , THREE), 6 VINEWHIP("つるのむち", GRASS, SPECIAL, , , THREE), 7 GROWL("なきごえ", NORMAL, STATUS, , , THREE); 8 9 private String moveName;// わざ名 10 private Type moveType;// わざのタイプ 11 private MoveCategory moveCategory;// わざの型(ぶつり/とくしゅ/へんか) 12 private String Power;// わざの威力 13 private String PP;// わざ使用最大回数 14 private Priority priority;// 優先度 15 16 private Move 17 (String name, Type t, MoveCategoty mc, int a, int b, Priotrity p){ 18 this.moveName = name; 19 this.moveType = t; 20 this.moveCategory = mc; 21 this.Power = a + ""; 22 this.PP = b + ""; 23 this.priority = p; 24 } 25 26 public String getPower(){ 27 return this.Power; 28 } 29 30 public String getPP(){ 31 return this.PP; 32 } 33 34 public Type getType(){ 35 return this.moveType; 36 } 37 38 public MoveCategory(){ 39 return this.moveCategory; 40 } 41 42 @Override 43 public String toString(){ 44 return this.moveName; 45 } 46 47 public static Move getById(int i){ 48 for(Type t : Type.values()){ 49 if(t.ordinal() == i)return t; 50 } 51 return null; 52 } 53}

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

#1

jimbe

総合スコア11352

投稿2023/03/14 16:48

編集2023/03/15 17:54

何個でも、必要なら作れば良いのでは無いでしょうか。
問題があるかどうかは環境に依る部分が大きいと思いますので、やってみれば分かることです。
でも私なら、型やタイプ(ポケモンやらないので違いが分かりません)はともかく、 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 でも同じですし、普通のオブジェクトに保存した値を変更できなくすれば読み込んだ後に不正値になる心配もありません。

perfectibility👍を押しています
perfectibilityを押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

#2

perfectibility

総合スコア3

投稿2023/03/15 12:05

#1
jimbe

総合スコア11352

投稿2023/03/14 16:48

編集2023/03/15 17:54

何個でも、必要なら作れば良いのでは無いでしょうか。
問題があるかどうかは環境に依る部分が大きいと思いますので、やってみれば分かることです。
でも私なら、型やタイプ(ポケモンやらないので違いが分かりません)はともかく、 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 でも同じですし、普通のオブジェクトに保存した値を変更できなくすれば読み込んだ後に不正値になる心配もありません。

さん、回答ありがとうございます。
ご指摘通り確かに分かりづらかったので、表現を少し改善しました。

問題があるかは仰るとおり環境に依るので一概には言えませんよね...

csv経由でのクラス等はまだ知らない事が多いのでしっかり勉強しようと思います。

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

#3

perfectibility

総合スコア3

投稿2023/03/16 07:56

編集2023/03/16 08:12

#1
jimbe

総合スコア11352

投稿2023/03/14 16:48

編集2023/03/15 17:54

何個でも、必要なら作れば良いのでは無いでしょうか。
問題があるかどうかは環境に依る部分が大きいと思いますので、やってみれば分かることです。
でも私なら、型やタイプ(ポケモンやらないので違いが分かりません)はともかく、 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 でも同じですし、普通のオブジェクトに保存した値を変更できなくすれば読み込んだ後に不正値になる心配もありません。

さん、具体的なコード例まで載せていただきありがとうございます。
おかげさまでcsvファイルを使った全体像が見えてきました。

新たにPokemonCreate クラスを作り、PokemonCreate クラスで生成したいポケモンの情報をcsvファイルから読み取ってPokemonクラスに渡してインスタンスを生成する。
わざはポケモン1匹につき同時に4つまでで、ポケモンによって覚えられるわざが異なる、という条件があるので、仰る通り同時に必要なのは最大4つまでなのでわざのcsvファイルを一度に全て読み込む必要がありませんでした。
なので、Pokemon クラスのインスタンス生成時に
Move[] moveList = new Move[4];を持たせて、

  1. 覚えられるわざか
  2. 重複していないか
  3. 4つを超えていないか

を満たす時に、moveListに保持させるようにしようと思います。

こうすればわざを参照する時(戦闘やパーティを見るときなど)にいちいちわざのcsvファイルを読み込む必要も無くなると思うので。

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。