我正试图找到在Kotlin上对枚举进行“反向查找”的最佳方法 . 我对Effective Java的一个看法是,你在枚举中引入了一个静态映射来处理反向查找 . 使用简单的枚举将其移植到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中是否有一种方法可以使这些代码在枚举中更易于使用?
5 回答
首先,fromInt()的参数应该是Int,而不是Int? . 尝试使用null获取Type显然会导致null,并且调用者甚至不应该尝试这样做 . Map 也没有理由变得可变 . 代码可以减少到
那段代码太短了,坦率地说,我不确定是否值得尝试找到一个可重用的解决方案 .
在这种情况下没有多大意义,但这是@ JBNized解决方案的“逻辑提取”:
一般情况下,伴随对象可以重用它们(与Java类中的静态成员不同)
我们可以使用find Returns the first element matching the given predicate, or null if no such element was found.
我发现自己通过自定义,手动编码,值几次进行反向查找,并采用以下方法 .
使
enum
实现共享接口:这个接口(不管名称是多么奇怪:))将某个值标记为显式代码 . 目标是能够写:
使用以下代码可以轻松实现:
val t = Type.values()[序数]
:)