如何创建一个具有循环引用的枚举类?
以下是一个简单的示例(摘自这个Java问题):
enum class Hand(val beats: Hand) {
ROCK(SCISSORS), // Enum entry 'SCISSORS' is uninitialized here
PAPER(ROCK),
SCISSORS(PAPER);
}
如何创建一个具有循环引用的枚举类?
以下是一个简单的示例(摘自这个Java问题):
enum class Hand(val beats: Hand) {
ROCK(SCISSORS), // Enum entry 'SCISSORS' is uninitialized here
PAPER(ROCK),
SCISSORS(PAPER);
}
val
属性,因此通常很难解决此问题,并且经常表明数据模型存在问题。有关更广泛上下文的讨论,请参见这个问题/答案。val
属性来解决此简单示例。使用when
,getter可以以非常可读的方式定义:enum class Hand {
ROCK,
PAPER,
SCISSORS;
val beats: Hand
get() = when (this) {
ROCK -> SCISSORS
PAPER -> ROCK
SCISSORS -> PAPER
}
}
另一种解决方案(类似于Eugen Pechanec的答案)是使用密封类。由于其概念较少受限,实现相对于具有重写属性的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结合使用的信息。
没有流程控制语句的替代方案,与mhoff的答案相似:
enum class Hand {
ROCK {
override val beats: Hand
get() = SCISSORS
},
PAPER {
override val beats: Hand
get() = ROCK
},
SCISSORS {
override val beats: Hand
get() = PAPER
};
abstract val beats: Hand
}
: Hand()
^^ 除此之外,这两种情况编译成几乎相同的字节码。 - Eugen Pechanec