gpt4 book ai didi

enums - 下一个枚举值的 Kotlin 扩展,无需反射

转载 作者:行者123 更新时间:2023-12-01 16:47:56 28 4
gpt4 key购买 nike

我写了一个 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
  • 我可以在没有反射的情况下实现吗?
  • 如果没有,如何使用 Kotlins 反射来做到这一点?

  • 想法是从枚举值迭代到下一个。但仅适用于特定值,而不适用于整个枚举 values()列表。我想防止的是将以下内容添加到每个枚举类型:
    fun next() = if (this.ordinal == Color.values().size - 1) 
    Color.values()[0]
    else
    Color.values()[this.ordinal + 1]

    最佳答案

    您可以使用 the 1.1 RC build 在 Kotlin 1.1(目前,您可以尝试 enumValues<T>() )中无需反射即可做到这一点。 ,它不使用内部反射,因为它是在调用站点内联的,而对应的 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 .
    一种适用于 Kotlin 1.0.6 的替代方案(但仍使用来自 Java 反射的 getDeclaringClass() ):
    fun <T: Enum<T>> T.next(): T {
    val values = declaringClass.enumConstants
    val nextOrdinal = (ordinal + 1) % values.size
    return values[nextOrdinal]
    }

    关于enums - 下一个枚举值的 Kotlin 扩展,无需反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42308580/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com