Enums 如何在Kotlin中声明枚举类型的变量?

Enums 如何在Kotlin中声明枚举类型的变量?,enums,kotlin,Enums,Kotlin,下面,我创建了一个枚举类: enum class BitCount public constructor(val value : Int) { x32(32), x64(64) } 然后,我尝试在某个函数中声明一个变量: val bitCount : BitCount = BitCount(32) enum class BitCount(val value : Int) { x16(16), x32(32), x64(64); companion o

下面,我创建了一个枚举类:

enum class BitCount public constructor(val value : Int)
{
  x32(32),
  x64(64)
}
然后,我尝试在某个函数中声明一个变量:

val bitCount : BitCount = BitCount(32)
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 }
    }
}
但有一个编译错误:

错误:(18,29)Kotlin:无法实例化枚举类型


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

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

如果要创建新的位计数,只需按如下所示添加它:

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

如其他答案所述,您可以引用按名称存在的
枚举
的任何值,但不能构造新值。这并不能阻止你做类似于你所尝试的事情

// 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
的实例,则可以按以下方式扫描这些值。使用
伴生对象和
from()函数创建
enum

val bitCount : BitCount = BitCount(32)
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")
那么:

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)

如果在enum案例中找不到值,它将返回null

“enum类BitCount(val值:Int)”就足够了,因为您不能在enum之外创建实例。我知道,我认为enum类构造函数允许通过向enum实例传递相应的值来创建enum实例。这就是类的用途。BitCount.valueOf(“x32”)如果您只在运行时拥有名称,枚举在某种程度上就像一个“密封”的类层次结构,因为您不能在那些预定义的实例之外随机创建新实例。顺便说一句,对于简单的情况,您不必使用完整的构造函数语法,因此单词
构造函数
是多余的。只需使用
公共枚举类位计数(..)
即可。如果您仍然希望在给定数值的情况下创建枚举实例,您可以(但更多的是“查找给定数值的实例”):对于新手。阅读关于Kotlin中枚举的本教程。所有枚举常量都必须在枚举类定义中声明。您尝试(创建对象)的是一个常规类,而不是枚举类。请参考Kotlin枚举上的示例。很好!不过,你可能想使用
valueOf
;然后,看起来我们会在可能的输入上重载
valueOf(String)
.Variants:1)
时,正确处理
else
。2) 使用
firstOrNull
并将
from的返回值设置为可选。3) .对于新来的人。阅读关于Kotlin中枚举的本教程。您的“from()”方法应该在Kotlin库中!