言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Java辞典

  1. トップページ
  2. Java辞典
  3. enum

enum

対応: Java 5(2004)

列挙型(enum)は決まった選択肢の集合を型として定義する仕組みです。文字列や数値の定数より型安全で、フィールドやメソッドを持つこともできます(Java 5以降)。

構文

// 基本的なenum定義です
enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

// フィールドとメソッドを持つenum定義です
enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS  (4.869e+24, 6.0518e6);

    private final double mass;
    private final double radius;

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    double surfaceGravity() { return 6.67430e-11 * mass / (radius * radius); }
}

// 主なメソッドです
Season[] all  = Season.values();
Season s      = Season.valueOf("SPRING");
int idx       = Season.SUMMER.ordinal();
String name   = Season.SUMMER.name();

メソッド一覧

メソッド概要
values()すべての列挙値を宣言順に格納した配列を返します。
valueOf(String name)名前に一致する列挙値を返します。一致しない場合は IllegalArgumentException をスローします。
ordinal()列挙値の宣言順インデックスを返します(0始まり)。
name()列挙値の宣言名を文字列で返します。toString() のデフォルトと同じです。
compareTo(E other)宣言順で比較します。

サンプルコード

sample_EnumExample.java
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

enum Status {
    PENDING("保留中"),
    ACTIVE("有効"),
    CLOSED("終了");

    private final String label;
    Status(String label) { this.label = label; }
    String getLabel() { return label; }
}

class EnumExample {
    public static void main(String[] args) {
        // 基本的なenumの使い方です
        Day today = Day.WED;
        System.out.println(today);           // 『WED』と出力されます。
        System.out.println(today.ordinal()); // 『2』と出力されます。
        System.out.println(today.name());    // 『WED』と出力されます。

        // switch文でenumを使います
        switch (today) {
            case SAT: case SUN:
                System.out.println("休日です。");
                break;
            default:
                System.out.println("平日です。");
        }

        // values() でループ処理します
        for (Day d : Day.values()) {
            System.out.print(d + " ");
        }
        System.out.println(); // 改行します。

        System.out.println(Status.ACTIVE.getLabel()); // 『有効』と出力されます。

        // valueOf() で文字列からenumを取得します
        Status s = Status.valueOf("CLOSED");
        System.out.println(s.getLabel()); // 『終了』と出力されます。
    }
}
EnumExample.java
javac EnumExample.java
java EnumExample
WED
2
WED
平日です。
MON TUE WED THU FRI SAT SUN
有効
終了

概要

列挙型は単なる定数より型安全で、コンパイル時に不正な値の代入を防ぎます。フィールドやメソッドを追加することで、各列挙値に付随するデータや振る舞いを持たせることができます。

『ordinal()』で得られるインデックスはDB保存などに使うと列挙値の追加・順序変更で壊れる恐れがあります。永続化には name() や専用の数値フィールドを使う方が安全です。

イミュータブルなデータクラスには『record』を、アクセス修飾子の詳細については『public / private / protected / static / final』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。