Kotlin扩展为下一个枚举值没有reflection

我写了一个Kotlin扩展,为枚举值添加next() 。 但有没有更好的方法来做到这一点?

 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. 我可以做到没有reflection?
  2. 如果没有,如何用科特林思考做到这一点?

该想法是从枚举值迭代到下一个。 但是只有一个特定的值,而不是整个枚举values()列表。 我想要防止的事情是将以下添加到每个枚举types:

 fun next() = if (this.ordinal == Color.values().size - 1) Color.values()[0] else Color.values()[this.ordinal + 1] 

你可以在不使用Kotlin 1.1(现在可以试用1.1 RC版本 )的情况下使用enumValues()来反省,因为它不是在内部使用reflection,因为它是在呼叫站点内联的,而相应的enumtypes在编译时被放置在结果代码中。 例:

 inline fun > T.next(): T { val values = enumValues() val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] } 

(这个代码的演示) | inlineenumValues()是必需的,因为enumValues()已经被reified T

与Kotlin 1.0.6一起使用的另一种方法(但仍使用Javareflection中的getDeclaringClass() ):

 fun > T.next(): T { val values = declaringClass.enumConstants val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] }