一、枚举类核心概念
枚举类(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 } }关键优势:
编译时安全:杜绝无效值
自描述性:通过名称直接表达含义
功能扩展:支持属性、方法和接口实现
对比密封类:
特性 枚举类 密封类 实例类型 同质 异构 实例数量 固定单例 可多实例 状态携带 常量级属性 子类独立状态 典型应用场景:
状态机(如订单状态:CREATED/PAID/SHIPPED)
错误代码集中管理
配置选项(如主题:LIGHT/DARK)
实现策略模式