enums - Kotlin 枚举中的循环引用

标签 enums kotlin circular-reference

如何创建带有循环引用的枚举类?

简单示例(取自 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/

相关文章:

java - android 中推送通知到达后如何更改家庭 Activity 中的通知图标

macos - 为什么 Swift 不自动处理循环引用(强引用循环)

Python 循环引用问题 :

枚举声明中的 C++ 变量声明

c++ - 使用 int 进行枚举类初始化

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

android - Dagger 柄。运行时错误。错误: ViewModel has no zero argument constructor (kotlin)

android - Retrofit 2 Request适用于Postman,但不适用于App

java - Spring循环引用示例

android - 来自枚举的 AlertDialog Builder setSingleChoiceItems