Kotlin 枚举类:从基础语法到高级实践 📅 发布时间:2026/8/28 17:38:49 👁 浏览次数: 1. 引言枚举类Enum Class是 Kotlin 中一种特殊的类用于表示一组固定的常量集合。与 Java 相比Kotlin 的枚举类功能更加强大支持属性、方法、构造函数以及接口实现等特性。本文将从基础语法入手逐步深入枚举类的高级用法并通过丰富的代码实例帮助读者全面掌握 Kotlin 枚举类。2. 枚举类的基础语法在 Kotlin 中使用enum class关键字声明枚举类。最简单的枚举类只包含一组常量名称每个常量之间用逗号分隔。enum class Color { RED, GREEN, BLUE }枚举常量是枚举类的实例可以通过枚举类名直接访问fun main() { val color Color.RED println(color) // 输出RED println(color.name) // 输出RED println(color.ordinal) // 输出0 }每个枚举常量都内置了name和ordinal两个属性分别表示常量名称和声明顺序从 0 开始。3. 枚举类的属性与构造函数枚举类可以像普通类一样定义构造函数和属性。在声明枚举常量时需要传入对应的构造参数。enum class Planet(val mass: Double, val radius: Double) { EARTH(5.972e24, 6.371e6), MARS(6.417e23, 3.389e6), JUPITER(1.898e27, 6.991e7); val density: Double get() mass / (4.0 / 3.0 * Math.PI * radius * radius * radius) } fun main() { println(Planet.EARTH.density) // 输出地球密度 println(Planet.JUPITER.mass) // 输出木星质量 }需要注意的是当枚举类包含属性或方法时枚举常量列表末尾必须使用分号;与后续成员分隔。4. 枚举类的方法枚举类可以定义成员函数每个枚举常量都会继承这些方法。同时也可以为单个枚举常量重写方法实现不同的行为。enum class Operation { PLUS { override fun apply(x: Int, y: Int): Int x y }, MINUS { override fun apply(x: Int, y: Int): Int x - y }, TIMES { override fun apply(x: Int, y: Int): Int x * y }; abstract fun apply(x: Int, y: Int): Int } fun main() { println(Operation.PLUS.apply(3, 4)) // 输出7 println(Operation.MINUS.apply(10, 4)) // 输出6 println(Operation.TIMES.apply(3, 4)) // 输出12 }在上面的例子中Operation枚举类声明了一个抽象方法apply每个枚举常量都提供了自己的实现。这种方式非常适合实现策略模式。5. 枚举类实现接口枚举类可以实现一个或多个接口。与普通类一样可以在枚举类中统一实现接口方法也可以在每个常量中单独实现。interface Describable { fun describe(): String } enum class Status : Describable { SUCCESS { override fun describe(): String 操作成功 }, FAILURE { override fun describe(): String 操作失败 }, PENDING { override fun describe(): String 等待处理 } } fun main() { println(Status.SUCCESS.describe()) // 输出操作成功 }6. 枚举类的常用内置方法Kotlin 为枚举类提供了两个重要的内置方法valueOf和entries或values。6.1 valueOf 方法valueOf方法根据字符串名称返回对应的枚举常量如果找不到会抛出IllegalArgumentException。fun main() { val color Color.valueOf(RED) println(color) // 输出RED // 以下代码会抛出异常 // val invalid Color.valueOf(YELLOW) }6.2 entries 与 values 方法entries是 Kotlin 1.9 引入的新 API返回枚举常量的列表values是旧版 API返回枚举常量数组。推荐优先使用entries。fun main() { // 推荐方式entries for (color in Color.entries) { println(${color.name} ${color.ordinal}) } // 旧版方式values for (color in Color.values()) { println(color) } }7. 枚举类的遍历与 when 表达式枚举类与when表达式配合使用非常方便Kotlin 编译器可以检查when分支是否覆盖了所有枚举常量从而避免遗漏。fun describe(color: Color): String when (color) { Color.RED - 红色 Color.GREEN - 绿色 Color.BLUE - 蓝色 } fun main() { println(describe(Color.GREEN)) // 输出绿色 }当when作为表达式使用时如果枚举类新增了常量而when分支没有同步更新编译器会直接报错这大大提升了代码的安全性。8. 枚举类的实际应用场景枚举类在真实项目中应用广泛常见的场景包括状态机、配置项、错误码定义等。下面以订单状态为例展示枚举类的综合应用。enum class OrderStatus(val code: Int, val description: String) { CREATED(0, 已创建), PAID(1, 已支付), SHIPPED(2, 已发货), COMPLETED(3, 已完成), CANCELLED(4, 已取消); fun canTransitionTo(next: OrderStatus): Boolean { return when (this) { CREATED - next PAID || next CANCELLED PAID - next SHIPPED || next CANCELLED SHIPPED - next COMPLETED COMPLETED - false CANCELLED - false } } } fun main() { val status OrderStatus.CREATED println(status.canTransitionTo(OrderStatus.PAID)) // 输出true println(status.canTransitionTo(OrderStatus.SHIPPED)) // 输出false }通过枚举类实现状态流转校验代码清晰且易于维护避免了大量散落的 if-else 判断。9. 枚举类与密封类的对比当需要表示一组受限类型时除了枚举类还可以使用密封类Sealed Class。两者各有适用场景枚举类适合表示固定且有限的常量集合每个常量是同一个类的实例侧重于「值」的枚举。密封类适合表示受限的类层次结构每个子类可以拥有不同的属性和状态侧重于「类型」的区分。sealed class Result { data class Success(val data: String) : Result() data class Error(val message: String) : Result() object Loading : Result() } fun handle(result: Result) when (result) { is Result.Success - println(成功${result.data}) is Result.Error - println(失败${result.message}) Result.Loading - println(加载中) }简单来说如果只需要一组固定的常量值优先选择枚举类如果需要为不同情况携带不同类型的数据则选择密封类。10. 总结本文系统介绍了 Kotlin 枚举类的基础语法、属性与方法、接口实现、内置方法以及实际应用场景。枚举类虽然简单但结合 Kotlin 的when表达式、扩展函数等特性可以写出非常优雅且安全的代码。在实际开发中建议根据业务需求合理选择枚举类或密封类让代码更加清晰、可维护。