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 
  1. 我能做到,没有思考?
  2. 如果没有,如何用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) | inlinereified是必需的,因为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] 
}