1. Kotlin 枚举与 when() 表达式简介

Kotlin 的枚举(enum)为处理多个条件判断提供了一种优雅的方式,尤其与 when() 表达式结合使用时,可以显著提升代码的可读性和可维护性。

在本教程中,我们将通过实际例子来讲解如何在 Kotlin 中结合使用枚举和 when() 表达式,以及这种组合如何让代码更清晰、更健壮。


2. Kotlin 枚举基础

枚举(enum)用于定义一组命名的常量值,是类型安全的表示方式。相比使用字符串或整数表示状态或类别,枚举提供了更好的语义和编译时检查。

示例如下:

enum class Color {
    RED, GREEN, BLUE
}

上面定义了一个 Color 枚举类,包含三个枚举值:REDGREENBLUE。Kotlin 的枚举类不仅可以包含属性和方法,还可以实现接口,因此在实际开发中非常灵活。


3. 使用 when() 简化条件判断

Kotlin 的 when() 表达式是传统 switch() 的强大替代品。它不仅支持枚举,还支持各种类型,语法简洁清晰。

我们来看一个例子,定义一个表示一周七天的枚举类:

enum class Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

然后我们根据不同的 Day 值返回不同的提示信息:

fun getDailyRoutine(day: Day): String {
    return when (day) {
        Day.MONDAY -> "Start of the workweek"
        Day.WEDNESDAY -> "Midweek - Keep pushing!"
        Day.FRIDAY -> "Almost there, the weekend is coming!"
        Day.SUNDAY -> "Relax and recharge"
        else -> "It's a regular day"
    }
}

在这个例子中,我们没有覆盖所有的枚举值,所以必须使用 else 分支来兜底。这类似于 Java 中 switchdefault

⚠️ 注意: Kotlin 的 when() 必须是“穷尽的”(exhaustive),也就是说必须覆盖所有可能的分支,否则编译器会报错。

3.1 不需要 else 的穷尽 when()

如果我们在 when() 中覆盖了所有枚举值,就可以省略 else 分支。

看一个完整的例子:

enum class Color {
    RED, GREEN, BLUE
}

fun getColorDescription(color: Color): String {
    return when (color) {
        Color.RED -> "The color is red."
        Color.GREEN -> "The color is green."
        Color.BLUE -> "The color is blue."
    }
}

✅ 这里我们覆盖了所有 Color 枚举值,所以无需 else。编译器会自动识别并允许我们省略。


4. 密封类(Sealed Class)与 when() 表达式

除了枚举,Kotlin 还提供了密封类(sealed class),它有时被称为“超级枚举”。密封类与枚举类似,但更灵活,可以有子类,并且可以携带数据。

一个典型的密封类结构如下:

sealed class Shape {
    object Triangle : Shape()
    object Square : Shape()
}

我们可以在 when() 中直接使用密封类:

fun main(args: Array<String>) {
    val shape: Shape = Shape.Triangle
    when (shape) {
        Shape.Square -> println("I'm a square")
        Shape.Triangle -> println("I'm a triangle")
    }
}

✅ 与枚举类似,如果我们覆盖了所有可能的子类,也可以省略 else 分支。编译器会检查所有子类是否都被处理。

⚠️ 踩坑提醒:密封类的子类必须在同一个文件中定义(Kotlin 1.5+),否则编译器无法识别所有子类,导致无法省略 else


5. 总结

在 Kotlin 中使用枚举配合 when() 表达式,是一种非常优雅且实用的编程方式:

  • ✅ 提升代码可读性
  • ✅ 减少冗余的 if-elseswitch-case 结构
  • ✅ 利用编译器保障穷尽性,提高代码健壮性
  • ✅ 密封类进一步扩展了 when() 的适用范围

如果你在开发中经常需要处理多个状态或类型判断,建议优先使用枚举或密封类配合 when() 表达式。

完整代码示例可在 GitHub 仓库 获取。


原始标题:Using Enums With when() in Kotlin