1. ホーム
  2. enums

[解決済み] 逆引きでKotlinのEnumを効率的に使う?

2022-06-13 20:50:59

質問

Kotlinでenumの'逆引き'をするのに最適な方法を見つけようとしています。Effective Javaから私が学んだことの1つは、逆引きを処理するためにenum内に静的マップを導入することでした。これを単純なenumでKotlinに移植すると、次のようなコードになります。

enum class Type(val value: Int) {
    A(1),
    B(2),
    C(3);

    companion object {
        val map: MutableMap<Int, Type> = HashMap()

        init {
            for (i in Type.values()) {
                map[i.value] = i
            } 
        }

        fun fromInt(type: Int?): Type? {
            return map[type]
        }
    }
}

私の質問は、これが最良の方法なのか、それとももっと良い方法があるのか、ということです。同じようなパターンに従ういくつかの列挙型がある場合はどうでしょうか?このコードを複数の列挙型でより再利用可能にする方法は Kotlin にあるでしょうか?

どのように解決するのですか?

まず、引数の fromInt()Int ではなく Int? . を取得しようとすると Type を取得しようとすると、明らかに null が返されます。そのため Map はミュータブルである理由もありません。このコードは以下のようになります。

companion object {
    private val map = Type.values().associateBy(Type::value)
    fun fromInt(type: Int) = map[type]
}

このコードはとても短いので、率直に言って、再利用可能な解決策を見つけようとする価値があるかどうかわかりません。