LoginSignup
64
56

More than 5 years have passed since last update.

Enum と数値の相互変換を汎用的に

Posted at

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 で定義して…て長くなるので別で投稿しよう。

参考

64
56
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
56