1.要件
数年ぶりに列挙体(enum)を理解するためにフルーツの種類で値をチェックします。
(※事前実行ができておらず、備忘録で書いています。ご了承ください。)
2.Enumを含む、メイン実行処理を作成
・Enum作成時の要点
⇒ 名称と値をペアで作成する。
⇒ 値をもらって、定義済みの値に含まれるのかをチェックして、問題ない場合は型で返す。
・使用時の要点
⇒ 値を元に型に変換して、型をベースでswitch文で名称単位で判定を行えること。
package jp.example.common;
import java.io.Serializable;
public class LogicFruit implements Serializable
{
/**
* フルーツの種類を定義するEnum
*/
public enum Fruit
{
/** リンゴ */
APPLE(0),
/** バナナ */
BANANA(1),
/** オレンジ */
ORANGE(2),
/** ブドウ */
GRAPE(3);
private final int value;
Fruit(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
public static Fruit fromValue(int value) throws Exception
{
for (Fruit fruit : Fruit.values())
{
if (fruit.getValue() == value)
{
return fruit;
}
}
throw new Exception("Fruitが不正な数値です。");
}
}
public static void main(String[] args)
{
System.out.println("--- Enumの基本的な使い方 ---");
// Enumの値を直接利用する
Fruit myFavoriteFruit = Fruit.APPLE;
System.out.println("好きなフルーツ: " + myFavoriteFruit); // "APPLE" と出力される
// getValue() を使って整数値を取得する
int fruitValue = myFavoriteFruit.getValue();
System.out.println(myFavoriteFruit + " の値: " + fruitValue); // "0" と出力される
System.out.println("\n--- fromValue() の使い方 ---");
try
{
// 整数値からEnum定数を取得する
int valueToFind = 2;
Fruit foundFruit = Fruit.fromValue(valueToFind);
System.out.println("値 " + valueToFind + " に対応するフルーツ: " + foundFruit); // "ORANGE" と出力される
// 存在しない値で試す
// Fruit.fromValue(10);
}
catch (Exception e)
{
System.err.println("エラーが発生しました: " + e.getMessage());
}
System.out.println("\n--- switch文での使い方 ---");
// switch文でEnumを使う
Fruit todayFruit = Fruit.BANANA;
switch (todayFruit)
{
case APPLE:
System.out.println("今日はリンゴです。");
break;
case BANANA:
System.out.println("今日はバナナです。");
break;
case ORANGE:
System.out.println("今日はオレンジです。");
break;
case GRAPE:
System.out.println("今日はブドウです。");
break;
default:
System.out.println("フルーツがありません。");
break;
}
System.out.println("\n--- すべてのフルーツをループで表示 ---");
// 拡張for文ですべてのEnum定数を処理する
for (Fruit fruit : Fruit.values())
{
System.out.println(fruit.name() + " の値は " + fruit.getValue());
}
}
}
2.Enum箇所の検証用のJunitの作成
package jp.example.common;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
// パラメータ化テスト関連のimportは不要なため削除
// クラス名をファイル名 'LogicFruitTest.java' に合わせる
class LogicFruitTest
{
@Test
@DisplayName("getValue()が正しい整数値を返すことをテスト")
void testGetValue()
{
assertEquals(0, LogicFruit.Fruit.APPLE.getValue());
assertEquals(1, LogicFruit.Fruit.BANANA.getValue());
assertEquals(2, LogicFruit.Fruit.ORANGE.getValue());
assertEquals(3, LogicFruit.Fruit.GRAPE.getValue());
}
@Test
@DisplayName("fromValue()が有効な値で正しいEnum定数を返すことをテスト")
void testFromValue_withValidValues() throws Exception
{
// 整数値からEnum定数を取得し、期待値と一致するか検証
assertEquals(LogicFruit.Fruit.APPLE, LogicFruit.Fruit.fromValue(0));
assertEquals(LogicFruit.Fruit.BANANA, LogicFruit.Fruit.fromValue(1));
assertEquals(LogicFruit.Fruit.ORANGE, LogicFruit.Fruit.fromValue(2));
assertEquals(LogicFruit.Fruit.GRAPE, LogicFruit.Fruit.fromValue(3));
}
@Test
@DisplayName("fromValue()が無効な値で例外をスローすることをテスト")
void testFromValue_withInvalidValue()
{
// 存在しない整数値を渡したときにExceptionがスローされることを検証
int invalidValue = 99;
// 例外がスローされることを期待する
Exception exception = assertThrows(Exception.class, () ->
{
LogicFruit.Fruit.fromValue(invalidValue);
});
// スローされた例外のメッセージが期待通りか検証
String expectedMessage = "Fruitが不正な数値です。";
String actualMessage = exception.getMessage();
assertEquals(expectedMessage, actualMessage);
}
}
3.まとめ
初歩的なものにはなりますが、あまり使うことがなく、思い出すのがめんどくさいのであまり使用してこなかったですが、対象の値に対して数値チェックだけではなくて規定値以外もエラーにできますし、値をあちこちに散見させなくても良いため、スッキリして使いやすくて良いですね。