Java の Enum は、要素がそれぞれ ordinal を持っている。
ので、要素と数値の相互変換ができる。
例えば、下のような Enum。
Alignment.java
public enum Alignment {
Left, // ordinal=0
Center, // ordinal=1
Right; // ordinal=2
}
普通に数値と要素の相互変換はこう書ける
// enum->数値
int order = Alignment.Center.ordinal();
// 数値->enum
Alignment[] values = Alignment.values();
Alignment align = values[order];
// 同じ
assertEqual(Alignment.Center, align);
Alignment.values としているところが気に入らない。
Enum 型に依存しない汎用関数みたいにしたい。
で、こんな関数を作った。
/**
* ordinal から指定した Enum の要素に変換する汎用関数
*/
public static <E extends Enum<E>> E fromOrdinal(Class<E> enumClass, int ordinal) {
E[] enumArray = enumClass.getEnumConstants();
return enumArray[ordinal];
}
使ってみる。
// enum->数値
int order = Alignment.Center.ordinal();
// 数値->enum
Alignment align = fromOrdinal(Alignment.class, order);
// 同じ
assertEqual(Alignment.Center, align);
ちょっと便利になった。
##補足
Enum.ordinal は、要素が追加されると値が変わっちゃうので、使うのよくないよ、と。
自分も実際には、private 変数を定義してそれを返す getter を interface で定義して…て長くなるので別で投稿しよう。
##参考