Java 中的嵌套 switch

2025年9月2日 | 阅读 5 分钟

switch 语句根据单个表达式的值来引导程序流程,并允许执行跳转到不同的代码段。当一个变量可以有许多已知值时,switch 通常比冗长的 if-else-if-else 链更能清晰地表达意图。switch 表达式中的值可以是整型(byte、short、int)、char、enum 或 String。请注意,long 类型不支持 switch 语句。

语法

嵌套 switch

放置在另一个 switch 语句内部的 switch 语句称为嵌套 switch 语句。

这可以轻松处理一种情况:当一个决策基于一个变量的值,然后对于某个特定情况,又基于另一个变量的值。每个 switch 语句都独立运作。内部 switch 中的 break 语句只会退出内部块,而不是外部块。

语法

switch(expression): 这是被计算的值。

case valueN: 这些是表达式要与之比较的特定值。break: 这是可选的,如果包含,它会在匹配到 case 后立即停止 switch 语句的执行。如果我们不使用 break,代码将继续执行到下一个 case,这种行为称为 fallthrough(穿透)。default: 这也是另一个可选部分,当没有 case 值匹配表达式时执行。

Nested switch in Java

示例:嵌套 switch 语句

示例

编译并运行

输出

Processing product of type: Electronics
Category: Computer Accessories

优点

  • 逻辑分组: 它们可以逻辑地分组相关条件,使得当决策是分层结构时,代码更容易遵循。
  • 性能: 在某些情况下,switch 语句可能比长 if-else 链更有效率,因为编译器可以使用跳转表对其进行优化。

缺点

  • 可读性: 嵌套 switch 语句可能变得难以阅读和维护,这个过程有时被称为“switch hell”(switch 地狱)。代码会深度缩进,难以调试。
  • 可维护性: 由于嵌套结构,添加新 case 或修改现有逻辑可能很复杂且容易出错。
  • 作用域限制: 只有当外部 case 匹配时,内部 switch 才会进行求值,如果内部条件经常为 false,这可能导致代码效率低下。

用例

  • 分层菜单: 嵌套 switch 对于导航多级菜单非常有效,其中一个级别的选择决定了下一级别的选项。
  • 状态机: 在简单的状态机中,嵌套 switch 可以根据当前状态和新事件来处理转换。
  • 命令解析: 在解析用户命令时,外部 switch 可能会识别命令类型(例如,“get”或“set”),而内部 switch 可能会处理该命令的特定选项或参数。

要记住的重要事项

忘记 break 语句: 穿透(Fall-through),因为我们可能在代码中遗漏了 break 语句。代码会继续执行到下一个 case,即使它不是正确的 case。这可能导致意外和不正确的行为。我们需要为内部和外部 switch 的 case 都添加 break。

Default Case 的放置: 要捕获任何意外或无效的输入,请务必使用 default case。如果我们忘记使用它,可能会发现有未处理的条件在执行期间出现。

变量作用域: 检查变量的可访问性。如果变量在内部 switch 的 case 块内声明,则意味着它们仅在该块内可用。我们在代码的其他地方无法访问它们。

过度嵌套: 如果使用超过两个级别的嵌套,可能会使代码难以阅读和维护。这会使我们的代码复杂化。

必须拥有 case 和 break: 每个 switch 都必须有自己的 case 和 break 语句。

结论

它们允许我们将一个 switch 语句嵌入到外部 switch 的一个 case 块中。这使得我们能够基于一个变量做出决策,然后再基于另一个变量做出进一步的决策。它们的替代方案对更复杂的场景有利,可以使代码更清晰、更有条理。对于简单的选择,单个 switch 就足够了。对于非常复杂或深入的决策,最好使用不同的方法来保持代码的整洁和易于管理。

Java 中的嵌套 switch 选择题

Q1. 另一个 switch 语句的 case 块中的 switch 语句被称为 ________。

  1. 条件 Switch 语句
  2. 递归 Switch 语句
  3. 顺序 Switch 语句
  4. 嵌套 Switch 语句
 

答案: d)

解释: 如提供的文本所述,放置在另一个 switch 语句内部的 switch 语句称为嵌套 switch 语句。


Q2. 内部 switch 语句中的 break 语句只会退出 _________。

  1. 当前 case
  2. 外部 switch 语句
  3. 内部 switch 语句
  4. 整个程序
 

答案:c)

解释: 在嵌套 switch 中,break 语句仅停止内部 switch 语句,允许控制返回到外部 switch。


Q3. 如果在 _______ 中未使用 break 语句,则代码将继续执行到下一个 case。

  1. fallthrough(穿透)
  2. flow-through(流程穿透)
  3. breakthrough(突破)
  4. code leakage(代码泄露)
 

答案: a)

解释: Fallthrough(穿透)一词用于描述在没有 break 语句的情况下,代码从一个 case 继续执行到下一个 case。


Q4. 内部 switch 语句仅在其对应的外部 _________ 匹配时才进行求值。

  1. break
  2. default
  3. 表达式
  4. case
 

答案: d)

解释: 只有当内部 switch 匹配到其对应的外部 case 时,才会对其进行求值。


Q5. 当嵌套 switch 语句变得难以阅读和维护时,这种情况有时被称为 _________。

  1. switch breakdown(switch 崩溃)
  2. switch maze(switch 迷宫)
  3. switch hell(switch 地狱)
  4. switch loop(switch 循环)
 

答案:c)

解释: switch hell(switch 地狱)这个词是深度嵌套的 switch 语句的常用说法,这些语句难以阅读和维护。