【问题标题】:How do I declare a variable of enum type in Kotlin?如何在 Kotlin 中声明枚举类型的变量?
【发布时间】:2015-07-18 08:41:38
【问题描述】:

按照the documentation,我创建了一个枚举类:

enum class BitCount public constructor(val value : Int)
{
  x32(32),
  x64(64)
}

然后,我尝试在某个函数中声明一个变量:

val bitCount : BitCount = BitCount(32)

但是有编译错误:

错误:(18, 29) Kotlin: 枚举类型不能被实例化

如何声明一个 BitCount 类型的变量并从 Int 初始化它?

【问题讨论】:

  • 顺便说一句,对于简单的情况,您不必使用完整的构造函数语法,因此 constructor 这个词是多余的。只需public enum class BitCount(..) 即可完成
  • 如果你仍然想创建一个给定数值的 Enum 的实例,你可以(但它更“找到给定数值的实例”):stackoverflow.com/a/34625163/3679676
  • 适合新手。阅读这篇关于 Kotlin 枚举的教程。 developine.com/enum-classes-in-kotlin-example
  • 所有枚举常量都必须在枚举类定义中声明。您正在尝试做的(创建对象)是针对常规类,而不是 ENUM。有关 Kotlin 枚举的示例,请参阅 tutorialkart.com/kotlin/enum-classes-in-kotlin

标签: enums kotlin


【解决方案1】:

如其他答案所述,您可以引用按名称存在的enum 的任何值,但不能构造新值。这并不妨碍您做与您尝试的类似的事情......

// wrong, it is a sealed hierarchy, you cannot create random instances
val bitCount : BitCount = BitCount(32)

// correct (assuming you add the code below)
val bitCount = BitCount.from(32)

如果您想根据数值 32 查找 enum 的实例,那么您可以通过以下方式扫描这些值。使用companion objectfrom() 函数创建enum

enum class BitCount(val value : Int)
{
    x16(16),
    x32(32),
    x64(64);

    companion object {
        fun from(findValue: Int): BitCount = BitCount.values().first { it.value == findValue }
    }
}

然后调用函数获取匹配的现有实例:

val bits = BitCount.from(32) // results in BitCount.x32

漂亮又漂亮。或者,在这种情况下,您可以根据数字创建 enum 值的名称,因为您在两者之间具有可预测的关系,然后使用 BitCount.valueOf()。这是伴随对象中的新 from() 函数。

fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue")

【讨论】:

  • 不错!不过,有人可能想使用valueOf;那么看起来我们会重载valueOf(String)
  • 变体:1) when 超过可能的输入,正确处理 else。 2) 使用firstOrNull 并使from 的返回值可选。 3)Preprocess a map.
  • 适合新手。阅读这篇关于 Kotlin 枚举的教程。 developine.com/enum-classes-in-kotlin-example
  • 你的“from()”方法应该在 Kotlin 库中!
【解决方案2】:

枚举实例只能在枚举类声明中声明。

如果你想创建新的 BitCount,只需添加它,如下所示:

enum class BitCount public constructor(val value : Int)
{
    x16(16),
    x32(32),
    x64(64)
}

并在任何地方使用BitCount.x16

【讨论】:

  • "enum class BitCount(val value: Int)" 就足够了,因为你不能在枚举之外创建实例
  • 我明白了,我认为枚举类构造函数允许通过将相应的值传递给它来创建枚举实例。
  • 这就是类的用途。
  • BitCount.valueOf("x32") 如果您在运行时只有名称
  • 枚举在某种程度上就像一个“密封的”类层次结构,因为您不能在预定义之外随机创建新实例。
【解决方案3】:

怎么样:

enum class BitCount constructor(val value : Int)
{
    x32(32),
    x64(64);

    companion object {
         operator fun invoke(rawValue: Int) = BitCount.values().find { it.rawValue == rawValue }
    }
}

然后你可以按照你的建议使用它:

val bitCount = BitCount(32)

如果在枚举情况下找不到值,它将返回 null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多