22:kotlin 类和对象 -- 枚举类(Enum classes)

枚举类最基本的用例是实现类型安全的枚举

enum class Direction {
   
    NORTH, SOUTH, WEST, EAST
}

每个枚举常量都是一个对象。枚举常量以逗号分隔。

由于每个枚举都是枚举类的一个实例,因此可以将其初始化为

enum class Color(val rgb: Int) {
   
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

匿名类

枚举常量可以声明自己的匿名类,这些匿名类具有对应的方法,并且可以重写基础方法

enum class ProtocolState {
   
    WAITING {
   
        override fun signal() = TALKING
    },

    TALKING {
   
        override fun signal() = WAITING
    };	// 分号

    abstract fun signal(): ProtocolState
}

如果枚举类定义了任何成员,则用分号将常量定义与成员定义分开

在枚举类中实现接口

枚举类可以实现一个接口(但不能继承自类)

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
   
    PLUS {
   
        override fun apply(t: Int, u: Int): Int = t + u	// 实现接口方法
    },
    TIMES {
   
        override fun apply(t: Int, u: Int): Int = t * u
    };

    override fun applyAsInt(t: Int, u: Int) = apply(t, u)	// 为所有枚举实例实现方法
}

所有枚举类默认实现了Comparable接口

使用枚举常量

enum class RGB {
    RED, GREEN, BLUE }
  • RGB.entries - 获取所有枚举实例
  • RGB.valueOf("RED") - 通过字符串获取相应的枚举实例
fun main() {
   
    for (color in RGB.entries) println(color.toString()) // prints RED, GREEN, BLUE
    println("The first color is: ${
     RGB.valueOf("RED")}") // prints "The first color is: RED"
}

如果.valueOf("")与所有枚举实例都不匹配,则报错IllegalArgumentException

1.9.0版本之前,values()代替entries

枚举有nameordinal属性,一个代表名字,一个代表枚举实例在枚举类中的索引(从0开始)

println(RGB.RED.name)    // RED
println(RGB.RED.ordinal) // 0

可以使用enumValues<T>()enumValueOf<T>()函数以通用的方式访问枚举类中的常量

enum class RGB {
    RED, GREEN, BLUE }

fun main() {
   
    println(enumValues<RGB>().joinToString {
    it->it.name })
     //  RED, GREEN, BLUE
}

1.9.20版本中,引入了enumEntries<T>()函数作为enumValues<T>()函数的未来替代品。

虽然enumValues<T>()函数仍然受到支持,建议改用enumEntries<T>()函数,因为它对性能的影响较小。每次调用enumValues<T>()时都会创建一个新的数组,而每次调用enumEntries<T>()时都会返回相同的列表,这更加高效

enum class RGB {
    RED, GREEN, BLUE }

fun main() {
   
    @OptIn(ExperimentalStdlibApi::class)
    println(enumEntries<RGB>())
    // [RED, GREEN, BLUE]
}

enumEntries<T>()函数是实验性的。要使用它,需要使用@OptIn(ExperimentalStdlibApi)进行选择,并将语言版本设置为至少1.9

相关推荐

  1. 22kotlin 对象 -- (Enum classes)

    2023-12-05 15:32:05       31 阅读
  2. Kotlin

    2023-12-05 15:32:05       41 阅读
  3. Kotlin 中密封与密封接口的对比分析

    2023-12-05 15:32:05       38 阅读
  4. 练习

    2023-12-05 15:32:05       11 阅读
  5. 11:kotlin 对象 -- 普通

    2023-12-05 15:32:05       43 阅读
  6. 简单使用

    2023-12-05 15:32:05       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 15:32:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 15:32:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 15:32:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 15:32:05       20 阅读

热门阅读

  1. 记QListWidget中QPushButton QSS样式失效的“bug”

    2023-12-05 15:32:05       31 阅读
  2. 基于蚁狮算法求解多目标优化问题的Matlab代码

    2023-12-05 15:32:05       42 阅读
  3. vue3 element-plus el-table表头冻结,表头吸顶

    2023-12-05 15:32:05       40 阅读
  4. 聊聊logback的ThrowableProxyConverter

    2023-12-05 15:32:05       38 阅读
  5. 2022大厂高频面试题之HTML篇

    2023-12-05 15:32:05       44 阅读
  6. Spring-Mybatis读写分离笔记整理

    2023-12-05 15:32:05       27 阅读
  7. PTA 7-238 整数转换为字符串

    2023-12-05 15:32:05       39 阅读
  8. 2023-简单点-tkinter中的ttk和tk

    2023-12-05 15:32:05       41 阅读
  9. RabbitMQ避免重复消费

    2023-12-05 15:32:05       58 阅读
  10. 简谈PostgreSQL的wal_level=logic

    2023-12-05 15:32:05       33 阅读