Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
enum
列挙型(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(); // 宣言順のインデックスを返します(0始まり)。
String name = Season.SUMMER.name(); // 宣言時の名前を文字列で返します。
メソッド一覧
| メソッド | 概要 |
|---|---|
| values() | すべての列挙値を宣言順に格納した配列を返します。 |
| valueOf(String name) | 名前に一致する列挙値を返します。一致しない場合は IllegalArgumentException をスローします。 |
| ordinal() | 列挙値の宣言順インデックスを返します(0始まり)。 |
| name() | 列挙値の宣言名を文字列で返します。toString() のデフォルトと同じです。 |
| compareTo(E other) | 宣言順で比較します。 |
サンプルコード
// 基本的なenumの使い方です。
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
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 + " "); // 『MON TUE WED THU FRI SAT SUN 』と出力されます。
}
// フィールドとメソッドを持つenumを使います。
enum Status {
PENDING("保留中"),
ACTIVE("有効"),
CLOSED("終了");
private final String label;
Status(String label) { this.label = label; }
String getLabel() { return label; }
}
System.out.println(Status.ACTIVE.getLabel()); // 『有効』と出力されます。
// valueOf() で文字列からenumを取得します。
Status s = Status.valueOf("CLOSED");
System.out.println(s.getLabel()); // 『終了』と出力されます。
概要
列挙型は単なる定数より型安全で、コンパイル時に不正な値の代入を防ぎます。フィールドやメソッドを追加することで、各列挙値に付随するデータや振る舞いを持たせることができます。
『ordinal()』で得られるインデックスはDB保存などに使うと列挙値の追加・順序変更で壊れる恐れがあります。永続化には name() や専用の数値フィールドを使う方が安全です。
イミュータブルなデータクラスには『record』を、アクセス修飾子の詳細については『public / private / protected / static / final』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。