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

作成したMagicMagicListクラスから、Characterクラスに魔法攻撃メソッド magic() を実装してみましょう。

メソッド名 処理
ATTACK 相手に攻撃
DEFENCE 相手の防御力を上げる
HEAL 相手のHPを回復する

ヒント

インターフェイスCharactermagic() メソッドを定義します。

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);
	...
}