第二部分:面向对象编程与 Kotlin 特性
第 6 章:数据类、密封类与枚举类
6.3 枚举类(enum class)与 when 表达式的结合
1. 枚举类的定义与特性
Kotlin 中的枚举类通过 enum class 关键字定义,用于表示一组有限的常量值。枚举类可以包含属性、方法和构造函数,使其比传统枚举更强大。
语法示例:
enum class Direction(val degrees: Int) {
NORTH(0),
EAST(90),
SOUTH(180),
WEST(270); // 分号结束枚举常量列表
fun opposite(): Direction {
return when (this) {
NORTH -> SOUTH
EAST -> WEST
SOUTH -> NORTH
WEST -> EAST
}
}
}
特点:
- 每个枚举常量是一个对象实例。
- 可以自定义构造函数和属性(如
degrees)。 - 支持方法定义(如
opposite())。
2. when 表达式与枚举类的结合
when 表达式是 Kotlin 中强大的模式匹配工具,与枚举类结合时可以实现类型安全的逻辑分支。
示例:
fun describeDirection(direction: Direction): String {
return when (direction) {
Direction.NORTH -> "Heading to the North"
Direction.EAST -> "Heading to the East"
Direction.SOUTH -> "Heading to the South"
Direction.WEST -> "Heading to the West"
}
}
优势:
- 穷尽性检查:如果
when表达式覆盖了所有枚举值,编译器不会要求else分支;若遗漏某个值,编译器会报错(除非显式添加else)。 - 简洁性:直接通过枚举常量匹配,避免冗余的
if-else链。
3. 高级用法:枚举类与密封类的结合
枚举类适合表示固定数量的常量,而密封类(sealed class)适合表示层次化的类型。二者可以结合使用,例如在 when 表达式中同时匹配枚举和其他类型。
示例:
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
enum class Status { IDLE, ACTIVE }
fun handleResult(result: Result, status: Status) {
when (result) {
is Result.Success -> println("Data: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
Result.Loading -> when (status) {
Status.IDLE -> println("Waiting...")
Status.ACTIVE -> println("Loading data...")
}
}
}
4. 实际应用场景
- 状态管理:如网络请求状态(
Loading/Success/Error)。 - 配置选项:如应用主题(
Light/Dark/System)。 - 命令模式:如游戏中的移动方向(
UP/DOWN/LEFT/RIGHT)。
Android 示例:
enum class ViewState { LOADING, CONTENT, EMPTY, ERROR }
fun updateUI(state: ViewState) {
when (state) {
ViewState.LOADING -> showProgressBar()
ViewState.CONTENT -> showContent()
ViewState.EMPTY -> showEmptyView()
ViewState.ERROR -> showErrorView()
}
}
5. 总结
- 枚举类:定义有限集合的常量,支持属性和方法。
when表达式:与枚举结合时提供类型安全的分支逻辑。- 最佳实践:优先使用
when的穷尽性检查,避免遗漏分支。
下一步学习:
在下一章中,我们将探讨单例模式与伴生对象(object 和 companion object)的使用场景。
