如何创建带有循环引用的枚举类?
简单示例(取自 this Java question):
enum class Hand(val beats: Hand) {
ROCK(SCISSORS), // Enum entry 'SCISSORS' is uninitialized here
PAPER(ROCK),
SCISSORS(PAPER);
}
最佳答案
由于 val
属性禁止重新分配,因此此问题通常难以解决,并且通常表明您的数据模型存在问题。有关更广泛背景下的讨论,请参阅 this question/answer(s) .
然而,这个简单的例子可以使用 val
property 来解决使用自定义 getter(因此没有支持字段)。使用 when
, getter 可以以非常易读的方式定义:
enum class Hand {
ROCK,
PAPER,
SCISSORS;
val beats: Hand
get() = when (this) {
ROCK -> SCISSORS
PAPER -> ROCK
SCISSORS -> PAPER
}
}
另一种解决方案(类似于 answer by Eugen Pechanec )是使用 sealed classes .由于它们的概念约束较少,因此与具有覆盖属性的 enum
相比,实现1稍微简单一些,可读性更好。
sealed class Hand {
abstract val beats: Hand
object ROCK: Hand() {
override val beats = SCISSORS
}
object PAPER: Hand() {
override val beats = ROCK
}
object SCISSORS: Hand() {
override val beats = PAPER
}
}
1个人意见
免责声明:我没有关于这些解决方案如何与经典 Java 结合使用的信息。
关于enums - Kotlin 枚举中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909718/