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

Enum (Java SE 17 & JDK 17)の使用例まとめです。
だいたいのメソッドを網羅済みです。
公式API仕様のおともにどうぞ。


概要

クラス構成

列挙型を 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発生!");
        }
    }
}

//func! : AAA
//CloneNotSupportedException発生!
Sample.AAA.func();

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,
}

System.out.println(Sample.AAA.describeConstable()); // 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 ()

enumクラスはfinalizeメソッドを持つことはできません。

オーバーライドできないため、API使用例は省略します。

final Class<E> getDeclaringClass ()

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

enum Sample {
    AAA, BBB;
}

System.out.println(Sample.AAA.getDeclaringClass()); // class Sample
System.out.println(Sample.BBB.getDeclaringClass()); // class Sample

System.out.println(Sample.AAA.getDeclaringClass() == Sample.BBB.getDeclaringClass()); // 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

// IllegalArgumentException : No enum constant Sample.ZZZ
//Enum.valueOf(Sample.class, "ZZZ");

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

  • public static T valueOf (String)

を使うこともおすすめです。

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

関連記事

ページの先頭へ