
Kotlinで逆引きできるEnumの実装
Enumをコード値から逆引きして作成したい状況はよくあるかと思います。
例えばDBの値とEnumのコード値が紐づいているときなどでしょうか。
実装方法
以下のようなcompanion objectを作成することで実装できます。
package hoge.constants
enum class Animal(
val dbParam: Int,
val displayName: String
) {
BIRD(0, "鳥"),
BEAR(1, "熊"),
HARE(2, "野ウサギ"),
FISH(3, "魚");
companion object {
fun getAnimalByDbParam(dbParam: Int): Animal = values().find { it.dbParam == dbParam } ?: throw NotFoundEnumException("Animal")
}
// 以下は記事の主題とは無関係ですが参考までに
// Thymeleaf上で取り扱う場合にはこのように定義しておいた方が便利かと思います
fun isBird(): Boolean = this == BIRD
fun isBear(): Boolean = this == BEAR
fun isHare(): Boolean = this == HARE
fun isFish(): Boolean = this == FISH
}呼び出し方
Animal.getAnimalByDbParam(1)
解説
JavaではEnum内にStaticメソッドを定義する方法をよく目にしますが、KotlinではStaticメソッドを宣言できない仕様となっています。
そのため、代替案としてcompanion objectを作成し、そのobjectのメソッドとして逆引き処理を実装しています。
ちなみにvalues()はKotlinのEnumに標準で備わっているメソッドです。
companion objectとは
class内で生成されるSingletonになります。
Kotlinではオブジェクトの宣言(object hoge)をすることでSingletonを生成することができます。
さらにコンパニオンとして定義(companion object hoge)することでオブジェクト呼び出しを省略できます。
詳しくは以下を参照してください。
参考:コンパニオンオブジェクト (Companion Objects)
注意点
あまりないパターンかもしれませんが、上記EnumをJavaで呼び出したいときには@JvmStaticをgetAnimalByDbParamに付与したほうが安全です。
付与しなかった場合には、Java側で呼び出す際「Animal.Companion.getAnimalByDbParam()」と記述する必要がある(=Companionオブジェクトの呼び出しを省略することが不可能となる)ためです。