Java Tips | コレクション:Enum一覧取得

Java Java
スポンサーリンク

Enum一覧取得は「コードに埋めた“選択肢”を、動的に取り出す」技

Enum は「定数の集合」を型として表現する仕組みです。
ステータス、区分コード、画面のプルダウン候補など、業務システムで大活躍します。

そして実務では必ずこうなります。
「この Enum の全パターンを一覧で欲しい」
「画面の選択肢に全部出したい」
「APIレスポンスに“選択肢一覧”を返したい」

このときに使うのが「Enum一覧取得」です。
今日は、values() の基本から、業務で使いやすいユーティリティまで、丁寧にかみ砕いていきます。


基本:Enum の全要素は values() で取れる

まずは素の Enum から

シンプルな Enum を一つ用意します。

public enum Status {
    NEW,
    IN_PROGRESS,
    DONE
}
Java

この全要素を取得する一番基本の方法が values() です。

Status[] all = Status.values();

for (Status s : all) {
    System.out.println(s);
}
// NEW
// IN_PROGRESS
// DONE
Java

ここでの重要ポイントは二つです。

一つ目は、「values() は“その Enum 型に定義されている全ての定数”を配列で返す」ことです。
追加・削除しても、values() を呼べば常に最新の一覧が取れます。

二つ目は、「values() は各 Enum 型ごとに自動生成される“静的メソッド”である」ことです。
Status.values() のように、Enum 型名に対して呼び出します。


配列→List にして扱いやすくする

Arrays.asList と List.of

配列のままでも使えますが、Stream やコレクションAPIと組み合わせるなら List にしておくと便利です。

import java.util.Arrays;
import java.util.List;

List<Status> list = Arrays.asList(Status.values());
Java

Java 9 以降なら、List.of でも書けます。

List<Status> list = List.of(Status.values());
Java

ここでの重要ポイントは、
「Enum の一覧は“配列”で返ってくるので、必要に応じて List に変換して使う」という感覚です。

List にしておけば、stream() で流したり、mapfilter をかけたりしやすくなります。


業務でよくある形:コード値や表示名を持つ Enum

code と label を持つ Enum の一覧

現場では、単に NEW などの名前だけでなく、
「コード値」「画面表示名」を持たせることが多いです。

public enum Status {
    NEW("N", "新規"),
    IN_PROGRESS("P", "処理中"),
    DONE("D", "完了");

    private final String code;
    private final String label;

    Status(String code, String label) {
        this.code = code;
        this.label = label;
    }

    public String getCode()  { return code; }
    public String getLabel() { return label; }
}
Java

このとき、「画面のプルダウン用に codelabel の一覧が欲しい」という要件がよく出ます。


Enum一覧を「DTOのList」に変換するユーティリティ

「コード+ラベル」のペアを作る

まず、画面やAPIに渡すためのシンプルな DTO を用意します。

public final class CodeLabel {
    private final String code;
    private final String label;

    public CodeLabel(String code, String label) {
        this.code = code;
        this.label = label;
    }

    public String getCode()  { return code; }
    public String getLabel() { return label; }
}
Java

これを作るユーティリティを Enum 側に用意してもいいですし、別クラスにしても構いません。
ここでは Enum 側に書いてみます。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public enum Status {
    NEW("N", "新規"),
    IN_PROGRESS("P", "処理中"),
    DONE("D", "完了");

    // フィールド・コンストラクタ・getter はさきほどと同じ

    public static List<CodeLabel> listCodeLabels() {
        return Arrays.stream(values())
                     .map(s -> new CodeLabel(s.code, s.label))
                     .collect(Collectors.toList());
    }
}
Java

使い方はこうです。

List<CodeLabel> options = Status.listCodeLabels();
// これをそのまま画面やAPIに渡す
Java

ここで深掘りしたいポイントは三つです。

一つ目は、「Enum 自身が“自分の一覧をどう外部に見せるか”を知っている」ことです。
Status.listCodeLabels() と書くだけで、「この Enum の選択肢一覧」が手に入ります。

二つ目は、「values()Arrays.stream で Stream に変換し、map で DTO に変換している」ことです。
Enum 一覧取得と Stream の組み合わせは、業務で非常によく使うパターンです。

三つ目は、「DTO を挟むことで、“内部の Enum 表現”と“外部に見せる形”を分離できる」ことです。
将来 label を変えたり、別の情報を足したりしても、Enum 内部で完結させられます。


汎用ユーティリティとしての Enum一覧取得

「どの Enum にも使える」形にする

複数の Enum で同じような「一覧取得+変換」をしたくなるので、
汎用的なユーティリティを用意するのもよくあります。

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public final class Enums {

    private Enums() {}

    public static <E extends Enum<E>, R> List<R> mapAll(
            Class<E> enumType,
            Function<E, R> mapper
    ) {
        return Arrays.stream(enumType.getEnumConstants())
                     .map(mapper)
                     .collect(Collectors.toList());
    }
}
Java

使い方の例です。

List<CodeLabel> options =
        Enums.mapAll(Status.class,
                     s -> new CodeLabel(s.getCode(), s.getLabel()));
Java

ここでの重要ポイントは二つです。

一つ目は、「Class<E>#getEnumConstants() で、“その Enum 型の全定数”を取得している」ことです。
Status.values() と同じ情報ですが、型を引数で受け取れるので汎用化できます。

二つ目は、「Function<E, R> mapper を渡すことで、“Enum をどう外部表現に変換するか”を呼び出し側が決められる」ことです。
CodeLabel に限らず、Map にしたり、別の DTO にしたり、柔軟に使えます。


Enum一覧取得で意識したいこと

「Enum を“単なる定数”で終わらせない」

Enum一覧取得の本質は、
Enum を「コードに埋めた定数」ではなく、
「システム全体で共有する“選択肢の定義”」として扱うことです。

そのために、

Enum 側に「自分の一覧を返すメソッド」を用意する
一覧を DTO や Map に変換するユーティリティを持つ
画面やAPIは「Enum の一覧メソッド」だけを見ればよい形にする

という設計にしておくと、
「選択肢が増えた/名前が変わった」といった変更に強くなります。


まとめ:Enum一覧取得ユーティリティで身につけてほしい感覚

Enum一覧取得は、
単に「values() を知る」話ではなく、
「Enum を“選択肢のソース”として設計し、一覧を安全に外に出す技術」です。

Status.values() で全要素を取り、必要に応じて List に変換する。
コード値や表示名を持つ Enum では、「一覧を DTO に変換するメソッド」を Enum 側に用意する。
汎用ユーティリティ(Enums.mapAll など)で、「どの Enum も同じパターンで一覧取得できる」形にする。
画面・API・バッチなど、Enum を使う側は「Enum の一覧メソッド」を見るだけで済むようにしておく。

あなたのコードのどこかに、
Enum の値を手書きで配列や List に並べている箇所があれば、
それを一度「Enum一覧取得+変換ユーティリティ」に置き換えられないか眺めてみてください。

その小さな整理が、
「Enum を“生きた選択肢定義”として扱えるエンジニア」への、
確かな一歩になります。

タイトルとURLをコピーしました