Extensión de Kotlin para el próximo valor de Enum sin reflexión

Escribí una extensión de Kotlin que agrega next() para los valores enum. ¿Pero hay una mejor manera de hacer eso?

 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. ¿Puedo lograr eso sin reflexiones?
  2. Si no, ¿cómo hacer eso con la reflexión de Kotlins?

La idea es iterar desde el valor enum al siguiente. Pero solo para un valor específico, no para la list de values() enum integers values() . Lo que quiero evitar es agregar lo siguiente a cada tipo de enumeración:

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

Puedes hacerlo sin reflection en Kotlin 1.1 (actualmente, puedes probar la versión 1.1 RC ) usando enumValues<T>() , que no usa el reflection en el interior, porque está en línea en los sitios de llamadas y la enum correspondiente tipo se coloca en el código resultante en time de compilation. Ejemplo:

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

(demostración de este código) | El inline y el reified son necesarios porque enumValues<T>() ha reified T

Una alternativa que funciona con Kotlin 1.0.6 (pero aún usa getDeclaringClass() desde la reflexión de Java):

 fun <T: Enum<T>> T.next(): T { val values = declaringClass.enumConstants val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] } 
  • Cómo pasar los valores de actividad a otra actividad en kotlin
  • Incluir propiedad declarada en el cuerpo de la class de datos en toString () en Kotlin
  • ¿Cómo puedo usar KotlinJS sin el stdlib?
  • Pasar una matriz de cadenas que no admiten nulos como una matriz de cadenas anulables
  • ¿Cómo encontrar qué elemento no comparó las matrices en Kotlin?
  • ¿Problemas para acceder al object compañero de Kotlin en Groovy?
  • Cómo instanciar una nueva instancia de tipo genérico
  • RxJava2: onComplete no llamado con flatMapIterable
  • El miembro abstracto no puede acceder directamente: Kotlin
  • Kotlin switch-statement con más de dos variables?
  • Intellij Idea no comstackrá kotlin pero maven lo hace