列挙型 は、変数が事前に定義された定数の集合のいずれかであることを可能にする、特別なデータ型です。
変数は、その列挙型に対して事前に定義された値のいずれかと等しくなければなりません。
よくある例としては、方位(NORTH、SOUTH、EAST、WESTという値)や曜日などがあります。
定数であるため、列挙型のフィールド名は大文字で書きます。
Javaプログラミング言語では、enumキーワードを使って列挙型を定義します。
たとえば、曜日の列挙型は次のように書きます。
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
固定された定数の集合を表したいときは、いつでも列挙型を使うとよいでしょう。 太陽系の惑星のような自然な列挙型もあれば、コンパイル時にすべての値がわかっているデータの集合、たとえばメニューの選択肢やコマンドラインフラグなども当てはまります。
上のDayOfWeek列挙型を使う方法を、コードで見てみましょう。
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
Javaプログラミング言語の列挙型は、他の言語の列挙型よりもはるかに強力です。
enum宣言は、クラス(列挙型 と呼びます)を定義します。
列挙型のクラス本体には、メソッドや他のフィールドを含めることができます。
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
Rating列挙型のメンバーに対してgetNumberOfStarsメソッドを呼び出すと、次のようになります。
Rating.GOOD.getNumberOfStars();
// => 4
コンパイラーは、列挙型を作成するときに、いくつかの特別なメソッドを自動的に追加します。
たとえば、静的メソッドのvaluesは、宣言された順に列挙型のすべての値を含む配列を返します。
for (DayOfWeek dayOfWeek : DayOfWeek.values()) {
System.out.println(dayOfWeek.toString());
}
上のスニペットは、次のように出力します。
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
コンパイラーは、名前を基に列挙型のメンバーを返す静的メソッドvalueOfも追加します。
DayOfWeek.valueOf("SUNDAY");
// => DayOfWeek.SUNDAY