[Java] Enum(列挙型)についてまとめ

Enum(列挙型)について

概要

Enumは同じカテゴリの定数をまとめて管理するためのもので、クラスのように扱うことができます。

なお、JVM上はクラスとして扱われるため、メソッドやコンストラクタを定義することもできます。

構文

アクセス修飾子 enum 列挙名 { 列挙子, 列挙子, 列挙子... }

Enumの基本的な使い方

定義例

public enum Status {
    DISABLED,
    APPROVED,
    ENABLED
}

Enumを使った分岐処理

Status status = Status.APPROVED;

switch (status) {
    case DISABLED:
        System.out.println("無効");
        break;
    case APPROVED:
        System.out.println("承認");
        break;
    case ENABLED:
        System.out.println("有効");
        break;
}

配列で列挙子をすべて取得する

Status[] statuses = Status.values();

列挙子を文字列で取得する

Status status = Status.valueOf("APPROVED");

存在しない列挙子を指定すると IllegalArgumentException が発生します。

列挙子に値を持たせる

構文

アクセス修飾子 enum 列挙名
{
    列挙子(値),
    列挙子(値),
    列挙子(値)...

    private 型 フィールド;

    private コンストラクタ {}
}

定義例

enum Status {
    DISABLED("無効"),
    APPROVED("承認"),
    ENABLED("有効");

    private String value;

    Status(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}
  • 列挙子の値を格納するためのフィールドと、初期化するためのコンストラクタが必須になる。
  • コンストラクタをpublicにするとコンパイルエラーになる。これはEnumのインスタンスを生成するのはJVMのみが行うため。

コンストラクタについて

JVM上ではクラスとして扱われるため、使用する際に列挙子ごとにインスタンスが生成されます。

以下のコードは、Enumのコンストラクタにログを出力して、コンストラクタコール回数を確認します。

enum Status {
    DISABLED("無効"),
    APPROVED("承認"),
    ENABLED("有効");

    private String value;

    Status(String value) {
        System.out.println(value);  // ★検証
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}

public class EnumTest {
    public static void main(String[] args) {
        Status status = Status.APPROVED;
    }
}

このコードを実行すると、以下のようにコンストラクタが3回実行されているのが分かります。

java EnumTest.java
無効
承認
有効

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)