1. Java 的 switch 语句

Java 的 switch 语句虽然历史悠久,但在表达能力和灵活性上相比 Kotlin 的 when 有一定差距。在 Java 7 之前,switch 只支持基本数据类型(如 intchar)和枚举类型;从 Java 7 开始,才支持使用 String 类型。

下面是一个典型的使用 switch 的例子:

int number = 3;
String description;
switch (number) {
    case 0:
        description = "Zero";
        break;
    case 1:
    case 2:
        description = "One or Two";
        break;
    case 3:
    case 4:
    case 5:
        description = "Between Three and Five";
        break;
    default:
        description = "Other";
}
System.out.println(description);

✅ 说明:

  • case 后面接的是具体的匹配值
  • 多个值共享一个逻辑时,需要多个 case 并列
  • 每个 case 分支执行完后要加 break,否则会继续向下执行(fall-through)
  • default 是可选的,用于兜底

⚠️ 踩坑提醒:忘记写 break 会导致逻辑错误,这是 Java switch 常见的“坑”。

2. Kotlin 的 when 表达式

Kotlin 的 when 是一种更现代、更灵活的条件判断表达式,可以看作是 Java switch 的增强版。它不仅语法更简洁,而且功能更强大。

来看一个等价的 Kotlin 实现:

fun describeNumber(number: Int): String {
    return when (number) {
        0 -> "Zero"
        1, 2 -> "One or Two"
        in 3..5 -> "Between Three and Five"
        else -> "Other"
    }
}

✅ 特点总结:

  • 支持多个值用逗号分隔(如 1, 2
  • 可以使用 in 关键字判断是否在某个区间(如 in 3..5
  • 不需要 break,不会有 fall-through 的问题
  • else 是必须的,用于兜底,避免遗漏逻辑分支

💡 小技巧:when 还可以不带参数使用,此时每个分支是一个布尔表达式:

when {
    number == 0 -> "Zero"
    number in 1..2 -> "One or Two"
    number in 3..5 -> "Between Three and Five"
    else -> "Other"
}

这种写法在判断逻辑较复杂时非常实用。

3. Java switch 与 Kotlin when 的对比

✅ 相似之处

对比点 说明
功能定位 都是用于多条件分支判断
多分支支持 都支持多个 case 分支
可读性 相比多个 if-else 更清晰

❌ 不同之处

对比点 Java switch Kotlin when
支持类型 基本类型、枚举、String(Java 7+) 任意类型
区间判断 不支持,需多个 case 或 if-else 支持 in 判断范围
多值匹配 需要多个 case 共享一个逻辑 用逗号分隔多个值
Fall-through 默认会继续执行下一个 case 不会自动 fall-through
表达式 vs 语句 语句(无返回值) 表达式(可返回值)
是否需要 default 不强制 强制需要 else 分支

4. 总结

Kotlin 的 when 相比 Java 的 switch 更加灵活、安全和表达力更强:

  • ✅ 支持任意类型、区间判断、布尔表达式
  • ✅ 无 fall-through 问题,不需要写 break
  • ✅ 支持返回值,可以作为表达式使用
  • ❌ Java 的 switch 在表达复杂逻辑时略显笨拙,容易出错

如果你正在使用 Kotlin,建议优先使用 when 来替代传统的多条件判断逻辑。不仅代码更简洁,也更易于维护和扩展。

如需查看完整示例代码,欢迎访问 GitHub:Kotlin when vs Java switch 示例代码


原始标题:Kotlin when vs. Java switch Statement