Kotlin 枚举类

发布于:2025-08-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、枚举类核心概念

枚举类(Enum Classes)是 Kotlin 中用于定义固定集合值的特殊类。它表示一组命名的常量,每个枚举常量都是该类的单例实例

二、基础语法与特性

1. 基本定义
enum class Color {
    RED, GREEN, BLUE
}
2. 带参数的枚举
enum class HttpStatus(val code: Int, val message: String) {
    OK(200, "Success"),
    NOT_FOUND(404, "Resource not found"),
    SERVER_ERROR(500, "Internal server error")
}
3. 实现接口
interface Printable {
    fun print()
}

enum class LogLevel : Printable {
    DEBUG {
        override fun print() = println("[DEBUG] Detailed info")
    },
    INFO {
        override fun print() = println("[INFO] Operation log")
    },
    ERROR {
        override fun print() = println("[ERROR] Critical issue")
    }
}
4. 内置属性
val color = Color.RED
println(color.name)    // 输出: RED
println(color.ordinal) // 输出: 0 (位置索引)

三、枚举类核心特性

特性 说明 示例
类型安全 编译时检查有效值 val color: Color = Color.RED
单例实例 每个枚举常量是唯一实例 Color.RED === Color.RED // true
可携带数据 每个常量可拥有独立属性 HttpStatus.OK.code // 200
可实现接口 支持实现接口并提供不同实现 LogLevel.DEBUG.print()
可定义方法 可在枚举类或单个常量中定义方法 Direction.NORTH.displayName()
迭代能力 可通过values()获取所有枚举值 Color.values().forEach { ... }

四、枚举类使用场景

1. 状态/模式管理
enum class ConnectionState {
    DISCONNECTED, CONNECTING, CONNECTED
}

fun handleState(state: ConnectionState) = when(state) {
    DISCONNECTED -> reconnect()
    CONNECTING -> showProgress()
    CONNECTED -> startDataTransfer()
}
2. 类型安全配置
enum class ImageFormat(val extension: String) {
    JPEG(".jpg"), PNG(".png"), WEBP(".webp")
}

fun saveImage(format: ImageFormat) {
    val filename = "image${format.extension}"
    // 保存操作
}

五、枚举类 vs 密封类

特性 枚举类 密封类
实例类型 所有实例相同类型 子类可以是不同类型
实例数量 固定数量(声明时确定) 子类可实例化多次
状态携带 常量可带属性但状态固定 每个子类可携带不同状态
继承能力 不能被子类化 可被继承(子类数量有限)
模式匹配 支持when穷举 支持when穷举+智能转换
适用场景 固定值集合(颜色/状态码) 有限但可扩展的类型集合(API响应/表达式树)

六、常见问题总结

Q:请解释Kotlin枚举类及其适用场景?

A

“Kotlin枚举类(enum class)是定义固定值集合的特殊类,核心解决三个问题:

1. 类型安全常量管理

  • 替代魔法数字/字符串,如HTTP状态码、错误类型

  • 示例:enum class HttpStatus { OK, NOT_FOUND }

2. 有限选项建模

  • 表示预定义选项集合,如方向、颜色、配置

  • 示例:enum class PizzaSize { SMALL, MEDIUM, LARGE }

3. 行为差异化实现

  • 通过抽象方法为每个常量提供不同行为

  • 示例策略模式:

    enum class Operation {
        ADD { override fun apply(a,b) = a+b },
        MULTIPLY { override fun apply(a,b) = a*b }
    }

关键优势

  • 编译时安全:杜绝无效值

  • 自描述性:通过名称直接表达含义

  • 功能扩展:支持属性、方法和接口实现

对比密封类

特性 枚举类 密封类
实例类型 同质 异构
实例数量 固定单例 可多实例
状态携带 常量级属性 子类独立状态

典型应用场景

  1. 状态机(如订单状态:CREATED/PAID/SHIPPED)

  2. 错误代码集中管理

  3. 配置选项(如主题:LIGHT/DARK)

  4. 实现策略模式