本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第7章 例外・enum・record ― エラーと向き合い、データを簡潔に表す · レッスン29

enum ― 決まった選択肢を型で表す

ブラウザで完結

導入

「信号機の色」「曜日」のように、決まった数個の値しか取らない ものを文字列"赤")や数値(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 から始まる番号で返します(RED0YELLOW1GREEN2)。

やってみよう

下のエディタで Signal s = Signal.YELLOW; を別の値に変えて実行し、if の分岐結果が変わることを確認しましょう。

演習

enum Season { SPRING, SUMMER, AUTUMN, WINTER } を作ってください。mainSeason 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()); }

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。