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());
JavaJava 9 以降なら、List.of でも書けます。
List<Status> list = List.of(Status.values());
Javaここでの重要ポイントは、
「Enum の一覧は“配列”で返ってくるので、必要に応じて List に変換して使う」という感覚です。
List にしておけば、stream() で流したり、map や filter をかけたりしやすくなります。
業務でよくある形:コード値や表示名を持つ 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このとき、「画面のプルダウン用に code と label の一覧が欲しい」という要件がよく出ます。
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 を“生きた選択肢定義”として扱えるエンジニア」への、
確かな一歩になります。
