Kotlin扩展为下一个枚举值没有反射
问题描述:
我写了一个Kotlin扩展,它为枚举值添加next()
。但是有没有更好的方法来做到这一点?Kotlin扩展为下一个枚举值没有反射
fun <T : Enum<*>> T.next(): T {
val values = this::class.java.getEnumConstants()
return if (this.ordinal < values.size - 1)
values[this.ordinal + 1]
else
values[0]
}
enum class Color {Red, Yellow, Green}
Color.Red.next() //Yellow
- 我能做到,没有思考?
- 如果没有,如何用Kotlins反射做到这一点?
该想法是从枚举值迭代到下一个。但仅限于特定的值,不适用于整个枚举values()
列表。我想阻止的事情就是把下面的添加到每个枚举类型:
fun next() = if (this.ordinal == Color.values().size - 1)
Color.values()[0]
else
Color.values()[this.ordinal + 1]
答
你可以做,没有反映在科特林1.1使用enumValues<T>()
(目前,你可以尝试the 1.1 RC build),不使用反射里面,因为它在呼叫站点被内联,并且相应的enum
类型在编译时被放置在结果代码中。例如:
inline fun <reified T: Enum<T>> T.next(): T {
val values = enumValues<T>()
val nextOrdinal = (ordinal + 1) % values.size
return values[nextOrdinal]
}
(demo of this code) | inline
和reified
是必需的,因为enumValues<T>()
具有reified T
。
与科特林1.0.6作品的另一种(但仍然使用getDeclaringClass()
从Java反射):
fun <T: Enum<T>> T.next(): T {
val values = declaringClass.enumConstants
val nextOrdinal = (ordinal + 1) % values.size
return values[nextOrdinal]
}