🏷️ 列挙型 (enum) の基本

列挙型(enum)は、取り得る値の集合があらかじめ決まっている定数を定義するための特別なデータ型です。

1. enumとは

  • 定数グループ: 曜日(月, 火, 水…)や月(1月, 2月…)、信号の色(赤, 黄, 青)のように、数が限られていて変化しない一連の定数を一つの型として定義できます。
  • 型の安全性: 単なるint型やString型で定数を定義するのに比べ、enumを使用すると、その型で定義された値以外は代入できなくなるため、コードの安全性が高まります

2. enumの定義

キーワードenumを使って定義します。定数はすべて大文字のスネークケースで記述するのがJavaの慣習です。

Java

public enum DayOfWeek {
    // 列挙定数
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

3. enumの使用

enumは他のデータ型と同様に変数宣言に使います。

Java

// DayOfWeek型の変数 today を宣言し、MONDAYを代入
DayOfWeek today = DayOfWeek.MONDAY; 

🔄 enumswitch文の連携

switch文は、列挙型と組み合わせることで最も効果を発揮します。

1. switch文での記述の簡潔さ

switch文でenum変数を使用する場合、caseラベルで**enum名(DayOfWeek.)を省略して定数名だけ**を記述できます。これにより、コードが非常に読みやすくなります。

Java

public class EnumSwitchExample {
    public static void main(String[] args) {
        DayOfWeek today = DayOfWeek.SUNDAY;

        switch (today) {
            case MONDAY: // DayOfWeek.MONDAY と書く必要がない
            case TUESDAY:
            case WEDNESDAY:
            case THURSDAY:
            case FRIDAY:
                System.out.println("今日は平日です。仕事を頑張りましょう!");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("今日は週末です。ゆっくり休みましょう。");
                break;
        }
    }
}

2. コンパイラによる網羅性のチェック

enumswitch文で使う最大のメリットは、コンパイラがすべての列挙定数が処理されているか(網羅されているか)をチェックしてくれることです。

  • もしenumに新しい定数(例:HOLIDAY)を追加し、switch文のcaseにその処理を書き忘れた場合、コンパイラやIDEが警告を出してくれます(ただし、defaultを記述している場合は警告されないことが多いです)。
  • この機能により、バグの発生を防ぎ、将来の変更に強いコードになります。

🛠️ enumは単なる定数ではない

Javaのenumは、単なる定数の集まりではなく、実際にはクラスの一種です。そのため、フィールド(変数)やメソッドを持つことができます。

例: enumに値を持たせる

各定数に関連するデータを持たせることで、より実用的な型として利用できます。

Java

public enum TrafficLight {
    // 定数と関連する値(秒数)を定義
    RED(30), 
    YELLOW(5), 
    GREEN(45);

    // フィールドを定義
    private final int duration; 

    // コンストラクタを定義(enumのコンストラクタはprivateになる)
    TrafficLight(int duration) {
        this.duration = duration;
    }

    // メソッドを定義
    public int getDuration() {
        return duration;
    }
}

この定義により、以下のように定数から直接関連データを取り出せます。

Java

TrafficLight light = TrafficLight.RED;
// RED(30)から値を取り出す
System.out.println("赤信号の継続時間: " + light.getDuration() + "秒"); // 出力: 30秒