広告

Java : Enum (列挙型) - API使用例

Enum (Java SE 22 & JDK 22) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
APIドキュメントのおともにどうぞ。


概要

これは、すべてのJava言語列挙型クラスの共通ベース・クラスです。 コンパイラによって合成される暗黙的に宣言されたメソッドの説明など、列挙の詳細は、「Java言語仕様」の8.9の項を参照してください。

クラス構成

列挙型を enum で宣言すると、Enumクラスが暗黙的に継承されます。
つまり、列挙型定数(識別子、列挙子)は Enumクラスを継承していることになり、Enumクラスの各メソッドが使えます。

enum Sample {
    AAA,
    BBB,
    CCC,
}

System.out.println(Sample.AAA.name()); // AAA
System.out.println(Sample.AAA.ordinal()); // 0

System.out.println(Sample.BBB.name()); // BBB
System.out.println(Sample.BBB.ordinal()); // 1

System.out.println(Sample.CCC.name()); // CCC
System.out.println(Sample.CCC.ordinal()); // 2

また、Enumクラスには定義されていませんが、列挙型では以下のメソッドが暗黙的に宣言されます。

  • public static T valueOf (String) : 指定した名前の列挙型定数を取得する
  • public static T[] values () : すべての列挙型定数を取得する
final Sample aaa = Sample.valueOf("AAA");
System.out.println(aaa); // AAA

final Sample[] values = Sample.values();
System.out.println(Arrays.toString(values)); // [AAA, BBB, CCC]

Enum の基本的な使い方は下記の記事にもまとめていますので、よろしければご参照ください。


コンストラクタ

Enum (String name, int ordinal)

唯一のコンストラクタです。

API仕様に、プログラマは使うことができないと明記されているため、使用例は省略します。

メソッド

protected final Object clone ()

CloneNotSupportedExceptionをスローします。

enum Sample {
    AAA, BBB, CCC;

    public void func() {
        System.out.println("func! : " + name());

        try {
            clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("CloneNotSupportedException!");
        }
    }
}

Sample.AAA.func();

// 結果
// ↓
//func! : AAA
//CloneNotSupportedException!

final int compareTo (E o)

このenumと指定されたオブジェクトの順序を比較します。

enum SampleX {
    AAA,
    BBB,
    CCC,
}

enum SampleY {
    CCC,
    BBB,
    AAA,
}

System.out.println(SampleX.AAA.compareTo(SampleX.AAA)); // 0
System.out.println(SampleX.AAA.compareTo(SampleX.BBB)); // -1
System.out.println(SampleX.AAA.compareTo(SampleX.CCC)); // -2

System.out.println(SampleY.AAA.compareTo(SampleY.AAA)); // 0
System.out.println(SampleY.AAA.compareTo(SampleY.BBB)); // 1
System.out.println(SampleY.AAA.compareTo(SampleY.CCC)); // 2

final Optional<Enum.EnumDesc<E>> describeConstable ()

このインスタンスの列挙型記述子EnumDescを返します(作成可能な場合)。作成できない場合は空のOptionalを返します。

enum Sample {
    AAA,
    BBB,
}

final var ret = Sample.AAA.describeConstable();
System.out.println(ret); // Optional[EnumDesc[Sample.AAA]]

final boolean equals (Object other)

指定されたオブジェクトがこのenum定数と同じ場合は、trueを返します。

enum SampleX {
    AAA,
    BBB,
}

enum SampleY {
    AAA,
    BBB,
}

System.out.println(SampleX.AAA.equals(SampleX.AAA)); // true
System.out.println(SampleX.AAA.equals(SampleX.BBB)); // false

System.out.println(SampleY.AAA.equals(SampleY.AAA)); // true
System.out.println(SampleY.AAA.equals(SampleY.BBB)); // false

System.out.println(SampleX.AAA.equals(SampleY.AAA)); // false
System.out.println(SampleY.BBB.equals(SampleX.BBB)); // false

protected final void finalize ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 最終決定は削除のために非推奨になりました。

非推奨です。

final Class<E> getDeclaringClass ()

このenum定数のenum型に対応するClassオブジェクトを返します。

enum Sample {
    AAA,
    BBB,
}

final var decA = Sample.AAA.getDeclaringClass();
System.out.println(decA); // class Sample

final var decB = Sample.BBB.getDeclaringClass();
System.out.println(decB); // class Sample

System.out.println(decA == decB); // true

final int hashCode ()

このenum定数のハッシュ・コードを返します。

enum Sample {
    AAA,
    BBB,
    CCC,
}

System.out.println(Sample.AAA.hashCode()); // 648786246
System.out.println(Sample.BBB.hashCode()); // 120360571
System.out.println(Sample.CCC.hashCode()); // 1710814638

final String name ()

enum宣言で宣言されているとおりのenum定数の名前を返します。

API仕様書では、代わりに toString メソッドを使うことがおすすめされています。

enum Sample {
    AAA,
    BBB,
    CCC,
}

System.out.println(Sample.AAA.name()); // AAA
System.out.println(Sample.BBB.name()); // BBB
System.out.println(Sample.CCC.name()); // CCC

final int ordinal ()

列挙定数の序数(列挙宣言での位置。初期定数はゼロの序数に割り当てられる)を返します。

enum Sample {
    AAA,
    BBB,
    CCC,
}

System.out.println(Sample.AAA.ordinal()); // 0
System.out.println(Sample.BBB.ordinal()); // 1
System.out.println(Sample.CCC.ordinal()); // 2

String toString ()

宣言に含まれるとおりのenum定数の名前を返します。

enum Sample {
    AAA,
    BBB,
    CCC,
}

final var str1 = Sample.AAA.toString();
System.out.println(str1); // AAA

final var str2 = Sample.BBB.toString();
System.out.println(str2); // BBB

final var str3 = Sample.CCC.toString();
System.out.println(str3); // CCC

static <T extends Enum<T>> T valueOf (Class<T> enumClass, String name)

指定された名前の指定されたenumクラスのenum定数を返します。

enum Sample {
    AAA,
    BBB,
    CCC,
}

final var aaa = Enum.valueOf(Sample.class, "AAA");
System.out.println(aaa); // AAA

final var bbb = Enum.valueOf(Sample.class, "BBB");
System.out.println(bbb); // BBB

try {
    Enum.valueOf(Sample.class, "ZZZ");
} catch (IllegalArgumentException e) {
    System.out.println("IllegalArgumentException! : " + e.getMessage());
}

// 結果
// ↓
//IllegalArgumentException! : No enum constant null.ZZZ

代わりに、概要のところでご紹介した

  • public static T valueOf (String)

メソッドを使うこともおすすめです。

final var aaa = Sample.valueOf("AAA");
System.out.println(aaa); // AAA

関連記事

ページの先頭へ