28.
Enum
Enumとは
Enum(列挙型)は、複数の定数をひとつにまとめるデータ型です。Enumはクラスの1つでフィールドやメソッドを定義できるため、プログラムの可読性が向上するのがメリットです。
Enumの基本
Enumの定義
Enumで定義する定数のことを列挙子といいます。
アクセス修飾子 enum 列挙型名 {
列挙子1, 列挙子2, 列挙子3, ...;
};
Enumのアクセス
Enumは「列挙型名」と「列挙子」でアクセスします。
列挙型名. 列挙子1;
列挙型名. 列挙子2;
列挙型名. 列挙子3;
Enumの作成
Enumファイル作成
enum Size
Enum.javaを作成し、enum Sizeを選択します。
Enumファイルが作成されました。
cafe.Size.java
public enum Size {
}
列挙子の定義
列挙子を「LARGE」「MEDIUM」「SMALL」を定義します。
cafe.Size.java
public enum Size {
LARGE, MEDIUM, SMALL
}
Drinkクラス修正
Sizeプロパティ追加
DrinkクラスにSize型のプロパティを定義します。
Drink.java
package cafe;
public class Drink {
public String name;
public Integer price;
//Size型のプロパティ
public Size size;
...
}
コンストラクタ追加
Size型を引数とするコンストラクタを追加します。
Drink.java
package cafe;
public class Drink {
public Drink(String name, Integer price) {
super();
this.name = name;
this.price = price;
}
//Size型を引数とするコンストラクタ
public Drink(String name, Integer price, Size size) {
super();
this.name = name;
this.price = price;
this.size = size;
}
....
}
メインアプリ
Drinkデータ生成
メインプログラムEnumAppで、Size型つきでDrinkインスタンスを生成します。
EnumApp.java
package cafe;
public class EnumApp {
public static void main(String[] args) {
Drink drink1 = new Drink("コーヒー", 350, Size.SMALL);
Drink drink2 = new Drink("コーヒー", 400, Size.MEDIUM);
Drink drink3 = new Drink("コーヒー", 450, Size.LARGE);
}
}
Sizeの列挙名表示
Drinkインスタンスのsizeプロパティをそれぞれ表示します。
cafe.EnumApp.java
public static void main(String[] args) {
Drink drink1 = new Drink("コーヒー", 350, Size.SMALL);
Drink drink2 = new Drink("コーヒー", 400, Size.MEDIUM);
Drink drink3 = new Drink("コーヒー", 450, Size.LARGE);
System.out.println(drink1.size);
System.out.println(drink2.size);
System.out.println(drink3.size);
}
列挙子が表示されました。
結果
SMALL
MEDIUM
LARGE
値取得
Enumの値定義
Enumでは列挙子とともに、文字列や数値の値を定義できます。
アクセス修飾子 enum 列挙型名 {
列挙子1(値1), 列挙子2(値2), 列挙子3(値3), ...;
};
Size型の値定義
Size型に「大」「中」「小」の文字列を定義します。
public enum Size {
LARGE("大"), MEDIUM("中"), SMALL("小");
}
コンパイルエラー
Enumでは、値の定義だけではコンパイルエラーになります。コンストラクタとアクセサメソッド定義が必要です。
Enumの修正
プロパティの追加
定数valueを定義します。アクセス修飾子privateとします。
public enum Size {
LARGE("大"), MEDIUM("中"), SMALL("小");
private final String value;
}
コンストラクタ追加
Enumのコンストラクタを追加し、値のデータ型を引数とします。
public enum Size {
LARGE("大"), MEDIUM("中"), SMALL("小");
private final String value;
//コンストラクタ追加
private Size(String value) {
this.value = value;
}
}
アクセサメソッド追加
値を取得するアクセサメソッド getValue() を追加し、定数valueを取得します。
public enum Size {
LARGE("大"), MEDIUM("中"), SMALL("小");
private final String value;
private Size(String value) {
this.value = value;
}
// getter追加
public String getValue() {
return this.value;
}
}
Enumの値取得
メインプログラムで、Enumの値を取得します。
データのアクセス方法
Enumの値は、getterメソッドでアクセスします。
Enum.getterメソッド()
Enumの値表示
Enumの値を表示してみましょう。
public static void main(String[] args) {
Drink drink1 = new Drink("コーヒー", 350, Size.SMALL);
Drink drink2 = new Drink("コーヒー", 400, Size.MEDIUM);
Drink drink3 = new Drink("コーヒー", 450, Size.LARGE);
System.out.println(drink1.size.getValue());
System.out.println(drink2.size.getValue());
System.out.println(drink3.size.getValue());
}
Sizeの値が表示されました。
結果
小
中
大
Enumのメソッド
valueOf()
valueOf() メソッドは、列挙子を文字列を指定して取得します。
EnumApp.java
String sizeString = "medium";
String key = sizeString.toUpperCase();
Size size = Size.valueOf(key);
System.out.println(size);
// valueOf() のアクセス
Size size = Size.valueOf(key);
文字列から列挙子を取得できました。
結果
MEDIUM
values()
values() メソッドは、列挙子をすべて取得します。
EnumApp.java
for (Size size : size.values()) {
System.out.println(size);
}
列挙子が繰り返し表示されました。
結果
SMALL
MEDIUM
LARGE
演習
問題1
次の表を参考にMagicTypeファイル作成し、Enumを定義してみましょう。
列挙子 | 値 | データ型 |
---|---|---|
ATTACK | 攻撃 | String |
DEFENCE | 防御 | String |
HEAL | 回復 | String |
問題2
次の表を参考に、魔法クラスMagicを作成してみましょう。コンストラクタはそれぞれのプロパティを引数とします。
項目 | プロパティ | データ型 |
---|---|---|
タイプ | type | MagicType |
名称 | name | String |
効果値 | value | Integer |
問題3
MagicListクラスを作成して、コンストラクタにMap型の魔法リストデータを作成してみましょう。
name | value | MagicType |
---|---|---|
ファイヤー | 4 | ATTACK |
ブリザード | 5 | ATTACK |
プロテス | 3 | DEFENCE |
ヒール | 5 | HEAL |
問題4
作成したMagic、MagicListクラスから、Characterクラスに魔法攻撃メソッド magic() を実装してみましょう。
メソッド名 | 処理 |
---|---|
ATTACK | 相手に攻撃 |
DEFENCE | 相手の防御力を上げる |
HEAL | 相手のHPを回復する |
ヒント
インターフェイスCharacterに magic() メソッドを定義します。
package character;
import item.Item;
import monster.Monster;
public interface ICharacter {
....
public void magic(Character character, Magic magic);
public void magic(Monster monster, Magic magic);
...
}