[Java] enumとDBに格納するコードを対応付けたい

2018年12月25日火曜日

Java

enum拡張

Javaのenumを拡張して、何らかの値を持たせることはよくあると思う。
特にDBに格納するコードとenumを対応付けたくなる。

そういう場合は、コンストラクタに引数を持たせて初期化する。

Fruits.java
enum Fruits implements CodeEnum {
    Apple(1),
    Orange(2),
    None(99);

    private int code;
    private Fruits(int code) { this.code = code; }
}

コード格納用インターフェース

コードとenumを変換する手順はインターフェースに持たせておいて、具体的なenum型ではこれを利用することにする。

CodeEnum.java
interface CodeEnum {
    int getCode();
    public static  T valueOf(T[] values, int code) {
        for (T v : values) {
            if (v.getCode() == code) return v;
        }
        throw new IllegalArgumentException("No enum constant " + code);
    }
}
Fruits.java
enum Fruits implements CodeEnum {
    Apple(1),
    Orange(2),
    None(99);

    private Fruits(int code) { this.code = code; }

    private int code;
    @Override public int getCode() { return code; }

    public static Fruits valueOf(int code) {
        return CodeEnum.valueOf(Fruits.values(), code);
    }
}
Fruits.Apple.getCode();
// 1
Fruits.None.getCode();
// 99
Fruits.valueOf(2);
// Orange
Fruits.valueOf(99);
// None

こうしておけば、特定のORマッピングツールなどに依存せずに、enumの定義だけでJavaのコードと外部コード定義の橋渡しができる。