列挙型の正体

enum Season { SPRING, SUMMER, AUTUMN, WINTER }
final class Season extends java.lang.Enum<Season> {
    public static final Season SPRING;
    public static final Season SUMMER;
    public static final Season AUTUMN;
    public static final Season WINTER;

    public static Season[] values() {
        return 列挙した値の配列;
    }

    public static Season valueOf(java.lang.String name) {
        return nameの値;
    }
}

Enumクラスのメソッド

class Enum<T> {
    // NG: オーバーライド不可
    final String name() {
        return enum定数の名前;
    }

    // OK: オーバーライド可
    String toString() {
        return enum定数の名前;
    }

    final boolean equals(Object other) {
        if (other == enum定数) {
            return true;
        } else {
            return false;
        }
    }

    final int hashCode() {
        return enum定数にハッシュコード;
    }

    static <T extends Enum<T>> T valueOf (Class<T> enumType, String name) {
        return 名前がnameで、型がenumTypeのenum定数;
    }

    final int oridinal() {
        return {}内の何番目に宣言したかを表す数(0始まり);
    }
}

switch文と列挙型

public class Main {
    public static void main(String[] args) {
        Season season = Season.SPRING;

        switch(season) {
            case: SPRING:
                System.out.println("pink");
            case: SUMMER:
                System.out.println("yellow");
            case: AUTUMN:
                System.out.println("brown");
            case: WINTER:
                System.out.println("white");
        }
        // RESULT: pink
    }
}

クラスとしての列挙型

enum Season {
    // これらはSeason型のオブジェクト
    SPRING(1), SUMMER(2), AUTUMN(3), // 引数ありのコンストラクタで生成
    WINTER(); // 引数なしのコンストラクタで生成

    // 変数が定義できる
    private int number;

    // コンストラクタが定義できる
    Season() {
        this.number = 100;
    }
    Season(int number) {
        this.number = number;
    }

    // メソッドが定義できる
    public int getNumber() {
        return number;
    }
}

public class Main {
    public static void main(String[] args) {
        // ここでSeason(1)というコンストラクタが実行される
        Season spring = Season.SPRING;
        System.out.println(spring.getNumber());
        // RESULT: 1

        // ここでSeason()というコンストラクタが実行される
        System.out.println(Season.WINTER.getNumber());
        // RESULT: 100

        // EnumクラスはComparableインターフェースを実装しており、
        // 各定数は宣言した順番で管理されている
        for (Season obj : Season.values()) {
            System.out.println(obj + " ");
        }
        // RESULT: SPRING SUMMER AUTUMN WINTER
    }
}