gpt4 book ai didi

kotlin - 如何获取给定密封类的所有子类?

转载 作者:IT老高 更新时间:2023-10-28 13:28:08 30 4
gpt4 key购买 nike

最近我们将其中一个枚举类升级为密封类将对象作为子类,这样我们就可以创建另一层抽象来简化代码。但是,我们不能再通过 Enum.values() 函数获得所有可能的子类,这很糟糕,因为我们严重依赖该功能。有没有办法通过反射或任何其他工具来检索这些信息?

PS:手动将它们添加到数组中是 Not Acceptable 。目前有 45 个,并且计划增加更多。


这就是我们的密封类的样子:

sealed class State

object StateA: State()
object StateB: State()
object StateC: State()
....// 42 more

如果有一个 values 集合,它将是这个形状:

val VALUES = setOf(StateA, StateB, StateC, StateC, StateD, StateE,
StateF, StateG, StateH, StateI, StateJ, StateK, StateL, ......

自然没有人愿意养这样一个怪物。

最佳答案

在 Kotlin 1.3+ 中,您可以使用 sealedSubclasses .

在以前的版本中,如果您将子类嵌套在基类中,那么您可以使用 nestedClasses :

Base::class.nestedClasses

如果您在基类中嵌套其他类,则需要添加过滤。例如:

Base::class.nestedClasses.filter { it.isFinal && it.isSubclassOf(Base::class) }

请注意,这会为您提供子类,而不是这些子类的实例(与 Enum.values() 不同)。


对于您的特定示例,如果 State 中的所有嵌套类是你的object状态然后您可以使用以下内容获取所有实例(如 Enum.values() ):

State::class.nestedClasses.map { it.objectInstance as State }

如果你想变得更漂亮,你甚至可以扩展 Enum<E: Enum<E>>并使用 reflection 从它创建您自己的类层次结构到您的具体对象.例如:

sealed class State(name: String, ordinal: Int) : Enum<State>(name, ordinal) {
companion object {
@JvmStatic private val map = State::class.nestedClasses
.filter { klass -> klass.isSubclassOf(State::class) }
.map { klass -> klass.objectInstance }
.filterIsInstance<State>()
.associateBy { value -> value.name }

@JvmStatic fun valueOf(value: String) = requireNotNull(map[value]) {
"No enum constant ${State::class.java.name}.$value"
}

@JvmStatic fun values() = map.values.toTypedArray()
}

abstract class VanillaState(name: String, ordinal: Int) : State(name, ordinal)
abstract class ChocolateState(name: String, ordinal: Int) : State(name, ordinal)

object StateA : VanillaState("StateA", 0)
object StateB : VanillaState("StateB", 1)
object StateC : ChocolateState("StateC", 2)
}

这样您就可以像调用任何其他 Enum 一样调用以下命令:

State.valueOf("StateB")
State.values()
enumValueOf<State>("StateC")
enumValues<State>()

更新

扩展 Enum Kotlin 不再支持直接。看 Disallow to explicitly extend Enum class : KT-7773 .

关于kotlin - 如何获取给定密封类的所有子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44784328/

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