0Pricing
Java Academy · レッスン

列挙型の定義と使用

enum 型を宣言し、その定数を使用して、values() と ordinal() で反復処理します。

「列挙型の定義と使用」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

列挙型の定義と使用

enum(列挙型)は、固定された定数の集合を表す特殊なクラスです。列挙型は型安全で読みやすく、staticなint定数よりも高機能です。

列挙型を宣言する

enumキーワードを使用して列挙型を宣言します。各定数は暗黙的にpublic static finalであり、列挙型のインスタンスです。

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
    FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.WEDNESDAY;
System.out.println(today);          // WEDNESDAY
System.out.println(today.name());   // WEDNESDAY
System.out.println(today.ordinal()); // 2 (zero-based index)

values()で反復処理する

EnumType.values()は、宣言された順序ですべての定数を返します。反復処理やメニューの作成に使用します。

enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE }

for (Planet p : Planet.values()) {
    System.out.println(p.ordinal() + ": " + p);
}
// 0: MERCURY
// 1: VENUS
// 2: EARTH
// ...

// Count constants
System.out.println(Planet.values().length); // 8

valueOf()と解析

Enum.valueOf(name)は、文字列を一致する定数に変換します。見つからない場合はIllegalArgumentExceptionをスローします。

enum Status { PENDING, ACTIVE, SUSPENDED, CLOSED }

String input = "ACTIVE";
Status s = Status.valueOf(input);
System.out.println(s); // ACTIVE

try {
    Status bad = Status.valueOf("UNKNOWN");
} catch (IllegalArgumentException e) {
    System.out.println("Invalid status: UNKNOWN");
}

// Safe parse pattern
static Status safeFrom(String name) {
    try { return Status.valueOf(name.toUpperCase()); }
    catch (IllegalArgumentException e) { return Status.PENDING; }
}

switchで列挙型を使用する

列挙型はswitch文やswitch式で問題なく使用できます。最新のswitch式を使うと、列挙型に対する振り分けを簡潔かつ網羅的に記述できます。

enum OrderStatus { CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED }

OrderStatus status = OrderStatus.SHIPPED;

String message = switch (status) {
    case CREATED     -> "Order received, awaiting payment";
    case PROCESSING  -> "Payment confirmed, preparing shipment";
    case SHIPPED     -> "On the way — track your package";
    case DELIVERED   -> "Delivered! Enjoy your order";
    case CANCELLED   -> "Order cancelled";
};
System.out.println(message); // On the way — track your package

if/elseで列挙型を使用する

列挙型の定数を比較するには==を使用します。列挙型の定数はシングルトンインスタンスであるため、参照の等価性が正しく機能します。

enum UserRole { GUEST, MEMBER, ADMIN, SUPERADMIN }

UserRole role = UserRole.ADMIN;

if (role == UserRole.ADMIN || role == UserRole.SUPERADMIN) {
    System.out.println("Access granted to admin panel");
} else {
    System.out.println("Access denied");
}

// Enum comparison: never use .equals() for enums
// == is correct and more readable

コレクションで列挙型を使用する

列挙型は標準コレクションに格納できます。列挙型を使った高パフォーマンスな格納には、EnumSetとEnumMapを使用します(後のレッスンで説明します)。

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN }

Set<Permission> userPerms = new HashSet<>();
userPerms.add(Permission.READ);
userPerms.add(Permission.WRITE);

System.out.println(userPerms.contains(Permission.DELETE)); // false
System.out.println(userPerms.contains(Permission.READ));   // true

List<Permission> allPerms = Arrays.asList(Permission.values());
System.out.println(allPerms.size()); // 4

列挙型によるインターフェースの実装

列挙型はインターフェースを実装できます。これにより、各定数に動作を持たせたり、すべての定数に共通する契約を定義したりできます。

interface Describable {
    String describe();
}

enum Season implements Describable {
    SPRING, SUMMER, FALL, WINTER;

    public String describe() {
        return switch (this) {
            case SPRING -> "Mild and rainy";
            case SUMMER -> "Hot and sunny";
            case FALL   -> "Cool with falling leaves";
            case WINTER -> "Cold and snowy";
        };
    }
}

for (Season s : Season.values()) {
    System.out.println(s + ": " + s.describe());
}

状態機械としての列挙型

列挙型は状態機械に自然に適しています。各定数が状態を表し、メソッドで有効な遷移を定義します。

enum TrafficLight {
    RED, YELLOW, GREEN;

    public TrafficLight next() {
        return switch (this) {
            case RED    -> GREEN;
            case GREEN  -> YELLOW;
            case YELLOW -> RED;
        };
    }
}

TrafficLight light = TrafficLight.RED;
for (int i = 0; i < 6; i++) {
    System.out.println(light);
    light = light.next();
}
// RED, GREEN, YELLOW, RED, GREEN, YELLOW

列挙型のベストプラクティス

列挙型を使用する際は、次のベストプラクティスに従ってください。

  • 定数にはALL_CAPS形式の名前を使用します(慣例)
  • 型安全性のため、intやStringの定数よりも列挙型を優先します
  • 網羅的な振り分けにはswitch式を使用します
  • 定数がデータを持つ場合は、列挙型にフィールドとメソッドを追加します

実践:HTTPステータスコード

数値コードから作成するファクトリーメソッドを備え、HTTPステータスのカテゴリをモデル化した実用的な列挙型です。

enum HttpStatus {
    OK(200), CREATED(201), BAD_REQUEST(400),
    UNAUTHORIZED(401), NOT_FOUND(404), SERVER_ERROR(500);

    public final int code;

    HttpStatus(int code) { this.code = code; }

    public static HttpStatus from(int code) {
        for (HttpStatus s : values())
            if (s.code == code) return s;
        throw new IllegalArgumentException("Unknown HTTP code: " + code);
    }

    public boolean isSuccess() { return code >= 200 && code < 300; }
}

HttpStatus s = HttpStatus.from(404);
System.out.println(s + " (" + s.code + ") success=" + s.isSuccess());
// NOT_FOUND (404) success=false

クイックチェック

次のコードの出力はどうなりますか。

enum Color { RED, GREEN, BLUE }
System.out.println(Color.GREEN.ordinal());

まとめ:列挙型の定義と使用

重要なポイント:

  • 列挙型では、型安全な固定の名前付き定数を定義します
  • values()はすべての定数を反復処理し、ordinal()は0から始まるインデックスを返します
  • valueOf()は文字列を一致する定数に変換します
  • 列挙型のインスタンスを比較するには、equalsではなく==を使用します
  • 列挙型は、網羅的な振り分けを行うswitch式で特に有効です
  • 列挙型はインターフェースを実装して、定数ごとに動作を持たせることができます

よくある質問

「列挙型の定義と使用」レッスンは無料ですか?

はい。「列挙型の定義と使用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「列挙型の定義と使用」で何を学びますか?

enum 型を宣言し、その定数を使用して、values() と ordinal() で反復処理します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「列挙型の定義と使用」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 列挙型の定義と使用
  2. フィールドとメソッドを持つ列挙型
  3. 列挙型を使った switch 式
  4. EnumSet と EnumMap
← Java Academyに戻る