是否可以覆盖 Kotlin 的 ENUM 名称?

Ely*_*lye 3 enums kotlin

我的枚举如下

    enum class ImagesType(val descriptor: String) {
        BIGGER("Bigger Image - Fall"),
        SMALLER("Smaller Image - Lion"),
        TALLER("Taller Image - Tree"),
        LONGER("longer Image - Bridge")
    }
Run Code Online (Sandbox Code Playgroud)
  • 当我println(ImagesType.BIGGER)打印时BIGGER
  • 当我val x = ImagesType.valueOf("SMALLER"),它会得到val x = SMALLER

这是因为name与枚举字符相同。我希望name用the 覆盖description,其中以下内容将为 true

  • 当我println(ImagesType.BIGGER)打印时Bigger Image - Fall
  • 当我val x = ImagesType.valueOf("Smaller Image - Lion"),它会得到val x = SMALLER

我试过

    enum class ImagesType(override val name: String) {
        BIGGER("Bigger Image - Fall"),
        SMALLER("Smaller Image - Lion"),
        TALLER("Taller Image - Tree"),
        LONGER("longer Image - Bridge")
    }
Run Code Online (Sandbox Code Playgroud)

但它未能表明这name是最终的。

Ely*_*lye 6

我用方法来得到我想要的东西。

    enum class ImagesType(val descriptor: String) {
        BIGGER("Bigger Image - Fall"),
        SMALLER("Smaller Image - Lion"),
        TALLER("Taller Image - Tree"),
        LONGER("longer Image - Bridge");

        override fun toString(): String {
            return descriptor
        }

        companion object {
            fun getEnum(value: String): ImagesType {
                return values().first { it.descriptor == value }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以它得到了我需要的结果

  • 当我println(ImagesType.BIGGER)打印时Bigger Image - Fall
  • 当我 val 时x = ImagesType.getEnum("Smaller Image - Lion"),它会得到 valx = SMALLER

我通过valueOf将其替换为 来实现覆盖的解决方法getEnum。看来valueOf无法超越。

  • 我建议将 `getEnum()` 重命名为 `forDescriptor()`,当作为 `ImagesType.forDescriptor()` 调用时,它具有更清晰的含义,并且与其他地方的工厂方法更加一致。另外,根据您使用它的方式,将枚举命名为单数而不是复数(“ImageType”,而不是“ImagesType”)可能会更好。另外,您可以将覆盖缩短为“覆盖 fun toString() = 描述符”。 (4认同)