Java : Enum (列挙型) - API使用例
Enum (Java SE 18 & JDK 18)の使用例まとめです。
だいたいのメソッドを網羅済みです。
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発生!");
}
}
}
//func! : AAA
//CloneNotSupportedException発生!
Sample.AAA.func();
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,
}
System.out.println(Sample.AAA.describeConstable()); // 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;
}
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 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
// 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
関連記事
- if文の基本
- while文の基本
- for文の基本
- プリミティブ型 (基本データ型)
- リテラルの表記方法いろいろ
- クラスの必要最低限を学ぶ
- インタフェースの default メソッドとは
- インタフェースの static メソッドの使いどころ
- var (型推論) のガイドライン
- アクセス修飾子の基本
- 配列 (Array) の使い方
- 拡張for文 (for-eachループ文)
- switch文ではなくswitch式を使おう
- try-with-resources文でリソースを自動的に解放
- テキストブロックの基本
- 列挙型 (enum) の基本
- ラムダ式の基本
- レコードクラスの基本 (Record Class)
- メソッド参照の基本
- シールクラスの基本(Sealed Class)