列挙型の正体
enum Season { SPRING, SUMMER, AUTUMN, WINTER }
final class Season extends java.lang.Enum<Season> {
public static final Season SPRING;
public static final Season SUMMER;
public static final Season AUTUMN;
public static final Season WINTER;
public static Season[] values() {
return 列挙した値の配列;
}
public static Season valueOf(java.lang.String name) {
return nameの値;
}
}
Enumクラスのメソッド
class Enum<T> {
// NG: オーバーライド不可
final String name() {
return enum定数の名前;
}
// OK: オーバーライド可
String toString() {
return enum定数の名前;
}
final boolean equals(Object other) {
if (other == enum定数) {
return true;
} else {
return false;
}
}
final int hashCode() {
return enum定数にハッシュコード;
}
static <T extends Enum<T>> T valueOf (Class<T> enumType, String name) {
return 名前がnameで、型がenumTypeのenum定数;
}
final int oridinal() {
return {}内の何番目に宣言したかを表す数(0始まり);
}
}
switch文と列挙型
public class Main {
public static void main(String[] args) {
Season season = Season.SPRING;
switch(season) {
case: SPRING:
System.out.println("pink");
case: SUMMER:
System.out.println("yellow");
case: AUTUMN:
System.out.println("brown");
case: WINTER:
System.out.println("white");
}
// RESULT: pink
}
}
クラスとしての列挙型
enum Season {
// これらはSeason型のオブジェクト
SPRING(1), SUMMER(2), AUTUMN(3), // 引数ありのコンストラクタで生成
WINTER(); // 引数なしのコンストラクタで生成
// 変数が定義できる
private int number;
// コンストラクタが定義できる
Season() {
this.number = 100;
}
Season(int number) {
this.number = number;
}
// メソッドが定義できる
public int getNumber() {
return number;
}
}
public class Main {
public static void main(String[] args) {
// ここでSeason(1)というコンストラクタが実行される
Season spring = Season.SPRING;
System.out.println(spring.getNumber());
// RESULT: 1
// ここでSeason()というコンストラクタが実行される
System.out.println(Season.WINTER.getNumber());
// RESULT: 100
// EnumクラスはComparableインターフェースを実装しており、
// 各定数は宣言した順番で管理されている
for (Season obj : Season.values()) {
System.out.println(obj + " ");
}
// RESULT: SPRING SUMMER AUTUMN WINTER
}
}