【プログラミングしてみよう21】Javaのenum(列挙型)で定数をスッキリ管理する

Java

前回はStringクラスのメソッドを使った文字列操作をまとめました。 今回は「enum(列挙型)」について解説します。 enumを使うことで、決まった種類の値をわかりやすく安全に管理できるようになります。

enumの基本

プログラムを書いていると、「曜日」「方角」「信号の色」のように、あらかじめ決まった種類の値だけを扱いたい場面がよくあります。こうした場合、これまでは文字列や数値で管理することが多かったと思います。

String day = "MONDAY";
int color = 1; // 1=赤, 2=青, 3=黄

しかしこの書き方では、タイプミスや想定外の値が入り込んでも気づきにくいという問題があります。enum を使うと、使える値をあらかじめ決めておくことができ、それ以外の値はコンパイル時にエラーとして検出されます。

public enum 列挙型名 {
    値1, 値2, 値3
}

サンプルコード(基本的なenum)

ファイル作成

「Java10」フォルダに Day.javaEnumTest.java という名前でファイルを作成します

コード入力

Day.java に以下のコードを入力します。

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

EnumTest.java に以下のコードを入力します。

public class EnumTest {
    public static void main(String[] args) {
        Day today = Day.WEDNESDAY;

        System.out.println("今日は:" + today);

        switch (today) {
            case MONDAY:
            case TUESDAY:
            case WEDNESDAY:
            case THURSDAY:
            case FRIDAY:
                System.out.println("平日です");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("週末です");
                break;
        }

        // すべての値を表示
        System.out.println("--- 曜日一覧 ---");
        for (Day day : Day.values()) {
            System.out.println(day);
        }
    }
}

コンパイル

javac Day.java EnumTest.java

実行

java EnumTest

実行結果は次のようになります。

今日は:WEDNESDAY
平日です
--- 曜日一覧 ---
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

サンプルコード(フィールドとメソッドを持つenum)

enumはフィールドやメソッドを持たせることもできます。たとえば各曜日に日本語名を持たせてみましょう。

ファイル作成

「Java10」フォルダに DayJP.javaEnumFieldTest.java という名前でファイルを作成します

コード入力

DayJP.java に以下のコードを入力します。

public enum DayJP {
    MONDAY("月曜日"),
    TUESDAY("火曜日"),
    WEDNESDAY("水曜日"),
    THURSDAY("木曜日"),
    FRIDAY("金曜日"),
    SATURDAY("土曜日"),
    SUNDAY("日曜日");

    private String japaneseName;

    DayJP(String japaneseName) {
        this.japaneseName = japaneseName;
    }

    public String getJapaneseName() {
        return japaneseName;
    }
}

EnumFieldTest.java に以下のコードを入力します。

public class EnumFieldTest {
    public static void main(String[] args) {
        DayJP today = DayJP.FRIDAY;

        System.out.println("今日は:" + today.getJapaneseName());

        System.out.println("--- 曜日一覧 ---");
        for (DayJP day : DayJP.values()) {
            System.out.println(day + " → " + day.getJapaneseName());
        }
    }
}

コンパイル

javac DayJP.java EnumFieldTest.java

実行

java EnumFieldTest

実行結果は次のようになります。

今日は:金曜日
--- 曜日一覧 ---
MONDAY → 月曜日
TUESDAY → 火曜日
WEDNESDAY → 水曜日
THURSDAY → 木曜日
FRIDAY → 金曜日
SATURDAY → 土曜日
SUNDAY → 日曜日

コードの解説

Day.WEDNESDAY のように、enumの値は 列挙型名.値名 という形でアクセスします。switch文でenumを使う場合は、case MONDAY: のように列挙型名を省略して値名だけ書くことができます。

Day.values() はenumに定義されたすべての値を配列として返します。拡張for文と組み合わせることで、すべての値を順番に取り出すことができます。

フィールドとメソッドを持つenumでは、各値に追加情報を紐づけることができます。DayJP の例では、MONDAY("月曜日") のようにコンストラクタに日本語名を渡し、private String japaneseName フィールドに保持しています。getJapaneseName() メソッドを通じてその値を取り出せます。enumのコンストラクタは必ず private または省略(デフォルトでprivate)になるため、外部から new することはできません。

enumはデザインパターンのSingletonと相性がよく、スレッドセーフなSingletonの実装にenumが使われることもあります。また、以前学んだswitch文との組み合わせが特に得意で、文字列や数値でのswitch文に比べてタイプミスによるバグを防ぎやすくなります。

まとめ

enumを使うことで、決まった種類の値を安全かつわかりやすく管理できます。文字列や数値で管理していた定数をenumに置き換えることで、タイプミスや想定外の値によるバグをコンパイル時に防ぐことができます。values() ですべての値を取得できる点や、フィールドとメソッドを持たせることで追加情報を紐づけられる点も覚えておきましょう。switch文や拡張for文との組み合わせも得意なため、曜日・方角・ステータス管理など、値の種類が決まっている場面ではぜひenumを活用してみてください。

2026/06/30(火) ぱんまる

コメント

タイトルとURLをコピーしました