nakamurakko’s blog

仕事で覚えたこと、勉強したことを自分のメモ代わりに書いていこうかなと。

Java の Enum

環境

  • Eclipse 2021-09 (4.21.0)
  • Java 17 2021-09-14 LTS

Java にも Enum があるらしく、少し確認してみた。

Enum

簡単な Enum を定義すると下記の通り。

public enum Statuses {
    OK,
    NG;
}

C# と変わらない。

が、こうなると大分変わる。

public enum Statuses {
    OK("正常終了のステータス。"),
    NG("何らかのエラーがあった場合のステータス。");

    /** 説明。 */
    private final String description;

    /**
     * コンストラクター。
     * 
     * @param description 説明。
     */
    private Statuses(String description) {
        this.description = description;
    }

    /**
     * 説明を返す。
     * 
     * @return description
     */
    public String getDescription() {
        return description;
    }

}

8.9.2. Enum Body Declarations を確認すると、コンストラクターやフィールドなどクラスと同様に定義できると書いてある。そのため、コンストラクターを用意して、

OK("正常終了のステータス。")

と、各 Enum 値に渡せると。(もうクラスでいいのでは。)

そして、下記のようなコードを用意して、コンソール出力してみる。

System.out.println(Statuses.OK + ":" + Statuses.OK.getDescription());

// 出力結果
// OK:正常終了のステータス。

定義した Enum Statuses.OK と、 Enum に用意した説明(getDescription()で取り出す)を出力している。

Enum 全て取り出したい時は、 values() を使う。(8.9.3. Enum Members)

// values() を使って Enum の値を全て出力。
for (Statuses status : Statuses.values()) {
    System.out.println("status.name() : " + status.name() + ", status.ordinal() : " + status.ordinal() + ", status.getCode() : " + status.getDescription());
}

EnumSet

Delphi における 集合 、 C# における FlagsAttribute は、 Java では EnumSet を使えば良いようだ。

// ビットフラグには EnumSet を使用する。
EnumSet<Statuses> statusSets;

// 定義した Enum を全て追加。
statusSets = EnumSet.allOf(Statuses.class);

if (statusSets.contains(Statuses.OK)) {
    System.out.println("EnumSet.allOf(Statuses.class) : OKあり");
} else {
    System.out.println("EnumSet.allOf(Statuses.class) : OKなし");
}

// 指定した Enum のみ追加。
statusSets = EnumSet.of(Statuses.NG);

if (statusSets.contains(Statuses.OK)) {
    System.out.println("EnumSet.of(Statuses.NG) : OKあり");
} else {
    System.out.println("EnumSet.of(Statuses.NG) : OKなし");
}

// AbstractCollection<E> を継承しているので、 add または remove が可能。
statusSets.add(Statuses.OK);

if (statusSets.contains(Statuses.OK)) {
    System.out.println("statusSets.add(Statuses.OK) : OKあり");
} else {
    System.out.println("statusSets.add(Statuses.OK) : OKなし");
}

// 出力結果
// EnumSet.allOf(Statuses.class) : OKあり
// EnumSet.of(Statuses.NG) : OKなし
// statusSets.add(Statuses.OK) : OKあり

上記サンプルコード : https://github.com/nakamurakko/JavaEnumStudy