背景
enum(定数)のフィールドを持ったドメインの要素を画面に表示したいため実装しました。
本記事に記載した方法は保守性などの観点からよくないという意見もあるため、仕様や実現したいことから実装方法を選定してください。
参考サイトは最後にまとめております。
環境
macOS Monterey / バージョン12.0.1
Spring Boot 2.7.7
IDE Eclipse
openJDK11
Maven3.8.6
Thymeleaf3
実現したいこと
enumクラスにて設定した定数をhtml、Thymeleafを利用して画面で表示する
Itemドメインにcolorというフィールドがあり、それを定数クラス群に設定する
Item.java
public class Item {
/** ID */
private Integer id;
/** 商品名 */
private String name;
/** 商品カラー */
private Integer color; //これを定数とする.
}
Color.java
public enum Color {
RED("red", 1), //定数名(key,value),フィールドはいくつでも設定可能
BLUE("blue", 2),
GREEN("green", 3);
private final String key;
private final int value;
//コンストラクタの設定(アクセス修飾子はprivate)
private Condition(final String key, final int value) {
this.key = key;
this.value = value;
}
/**
* カラーのIDから一致するインスタンスを返すメソッド.
*
* @param id カラーID
* @return 一致するインスタンス
*/
public static Color of(int value) {
for (Color color : Color.values()) {
if (color.getValue() == value) {
return color;
}
}
throw new IndexOutOfBoundsException("The value of color doesn't exist.");
}
public int getValue() {
return value;
}
public String getKey() {
return key;
}
enum.html
//画面表示
//クラス名はColor
//itemはControllerクラスなどでmodelに格納されているとする
<span th:text="${T(パッケージ名.クラス名).of(item.color).getKey()}"></span>
//セレクトボックスの作成
<select name="color">
<option th:each="color : ${T(パッケージ名.クラス名).values()}"
th:value="${color.getValue()}"
th:text="${color.getKey()}" >
</option>
</select>
参考