Mic*_*off 5 enums circular-reference kotlin
如何创建带循环引用的枚举类?
简单的例子(取自这个Java问题):
enum class Hand(val beats: Hand) {
    ROCK(SCISSORS), // Enum entry 'SCISSORS' is uninitialized here
    PAPER(ROCK),
    SCISSORS(PAPER);
}
由于禁止对val属性进行重新分配,因此通常很难解决此问题,并且通常表明数据模型存在问题.有关更广泛背景下的讨论,请参阅此问题/答案.
但是,可以使用具有自定义getter 的val 属性来解决此简单示例(因此没有支持字段).使用时when,可以用非常易读的方式定义getter:
enum class Hand {
    ROCK,
    PAPER,
    SCISSORS;
    val beats: Hand
        get() = when (this) {
            ROCK -> SCISSORS
            PAPER -> ROCK
            SCISSORS -> PAPER
        }
}
另一种解决方案(类似于Eugen Pechanec的答案)是使用密封类.由于它们的较少约束的概念,实现是1相比,稍微简单和更具有可读性enum与重写特性.
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
}
| 归档时间: | 
 | 
| 查看次数: | 491 次 | 
| 最近记录: |