Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第二部分:面向对象编程与 Kotlin 特性

第二部分:面向对象编程与 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. 实际应用场景

  1. 状态管理:如网络请求状态(Loading/Success/Error)。
  2. 配置选项:如应用主题(Light/Dark/System)。
  3. 命令模式:如游戏中的移动方向(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)的使用场景。

Last Updated:: 5/21/25, 7:58 PM