0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

久しぶりに列挙体(enum)を理解する

Posted at

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.まとめ

初歩的なものにはなりますが、あまり使うことがなく、思い出すのがめんどくさいのであまり使用してこなかったですが、対象の値に対して数値チェックだけではなくて規定値以外もエラーにできますし、値をあちこちに散見させなくても良いため、スッキリして使いやすくて良いですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?