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
- 我可以做到没有reflection?
- 如果没有,如何用科特林思考做到这一点?
该想法是从枚举值迭代到下一个。 但是只有一个特定的值,而不是整个枚举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,因为它是在呼叫站点内联的,而相应的enum
types在编译时被放置在结果代码中。 例:
inline fun > T.next(): T { val values = enumValues() val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] }
(这个代码的演示) | inline
和enumValues
是必需的,因为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] }