導入
「信号機の色」「曜日」のように、決まった数個の値しか取らない ものを文字列("赤")や数値(1)で表すと、"赤色" や 7 のような間違った値が入り込む余地が生まれます。決まった選択肢だけを許す型が enum(列挙型) です。
説明
public class Main {
public static void main(String[] args) {
Signal s = Signal.YELLOW;
if (s == Signal.RED) {
System.out.println("止まれ");
} else if (s == Signal.YELLOW) {
System.out.println("注意");
} else {
System.out.println("進め");
}
for (Signal sig : Signal.values()) {
System.out.println(sig.name() + ":" + sig.ordinal());
}
}
}
enum Signal {
RED, YELLOW, GREEN
}
enum Signal { RED, YELLOW, GREEN }…Signal型が取れる値は、この3つ だけ です。Signal.REDのように書いてアクセスします。==で比較できます(enumの値は決まった実体なので、値の比較として==が使えます)。.values()… その enum が持つすべての値を配列として返します。拡張forと組み合わせて全種類を走査するのによく使います。.name()… 定義したときの名前("RED"など)を文字列で返します。.ordinal()… 定義した順番を0から始まる番号で返します(REDは0、YELLOWは1、GREENは2)。
やってみよう
下のエディタで Signal s = Signal.YELLOW; を別の値に変えて実行し、if の分岐結果が変わることを確認しましょう。
演習
enum Season { SPRING, SUMMER, AUTUMN, WINTER } を作ってください。main で Season cur = Season.SUMMER; として、cur == Season.SUMMER なら "暑い" と表示してください。続けて Season.values() を拡張forで走査し、name() + ":" + ordinal() の形ですべて表示してください。
ヒント1を見る
enum Season { SPRING, SUMMER, AUTUMN, WINTER } の順番で定義します(ordinal() の番号は定義順になります)。
ヒント2を見る
for (Season s : Season.values()) { System.out.println(s.name() + ":" + s.ordinal()); }。