我有这个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/

10-12 05:01