Java : Enum (列挙型) - API使用例
Enum (Java SE 22 & JDK 22) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
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 ()
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 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 ()
enum Sample {
AAA,
BBB,
}
final var ret = Sample.AAA.describeConstable();
System.out.println(ret); // Optional[EnumDesc[Sample.AAA]]
final boolean equals (Object other)
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 ()
非推奨です。
final Class<E> getDeclaringClass ()
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 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 ()
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 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 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