我有这个enum
:
enum class Types(val value: Int) {
FOO(1)
BAR(2)
FOO_BAR(3)
}
如何使用
enum
创建该Int
的实例?我试图做这样的事情:
val type = Types.valueOf(1)
我得到了错误:
最佳答案
Enum#valueOf
is based on name。这意味着要使用它,您需要使用valueof("FOO")
。 valueof
方法还采用一个字符串,该字符串解释了该错误。字符串不是整数。类型很重要。我之所以也提到它的原因是,所以您知道这不是您要寻找的方法。
如果要基于int值获取一个值,则需要定义自己的函数。您可以使用values()
获得枚举中的值,在这种情况下,该值将返回Array<Types>
。您可以使用firstOrNull
作为一种安全的方法,如果您希望使用异常(exception)而不是null,则可以使用first
。
因此,添加一个伴随对象(相对于枚举是静态的),因此您可以在Types.getByValue(1234)
上调用Types.COMPANION.getByValue(1234)
(Java的Types.FOO.getByValue(1234)
)。
companion object {
private val VALUES = values();
fun getByValue(value: Int) = VALUES.firstOrNull { it.value == value }
}
values()
每次被调用时都会返回一个新的Array,这意味着您应该在本地对其进行缓存,以避免每次调用getByValue
时都重新创建一个数组。如果在调用该方法时调用values()
,则可能会重复创建它(取决于实际调用它的次数),这很浪费内存。如果您要这样做,也可以扩展该功能并根据多个参数进行检查。这些类型的函数不仅限于一个参数。
不过,功能的命名完全取决于您。不必是
getByValue
。关于kotlin - 如何从Kotlin中的Int创建枚举?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53523948/