前言
switch 语句是 Java 中用于多重条件判断的常见结构之一。然而,当我们在代码中遇到多个重复的 switch 语句时,会导致代码冗长、难以维护,并且效率低下。在本篇博客中,我将分享一些技巧和最佳实践,帮助您优化重复的 Switch 语句,提高 Java 代码的效率。
现象
switch 语句是根据类型代码进行的多分支选择语句,写出短小的 switch 语句很难;写出只做一件事的 switch 语句也很难,switch 语句天生要做很多事
常见的switch问题
- 每新增类型码的时候,都要增加 case 语句分支,导致分支越来越多,写出的函数不再短小简洁,违反了开闭原则
- 单个 case 分支中做了很多事,同样导致函数冗余,包含多个抽象层,违法单一原则
- 相同的 switch 语句分支分布在多个方法或类中,在新增类型代码的时候,必须找出所有的 switch 语句并修改,这样容易导致遗漏
解决办法
- 面向对象的语言:如果是面向对象的语言,大多数可以用多态替换多条 switch 语句
a. 通过提取函数,将 switch 语句提取到一个函数中;
b. 再通过搬移函数,将它移动到需要多态性的类中;
c. 再通过子类策略中的一种取代类型码;
d. 最后以多态取代表达式 - 面向过程的语言:
a. 如果 case 语句超过五个,为了使代码更加整洁,可以考虑用表驱动的方式:我们可以将条件和相应的操作映射到一个数据结构中,例如 HashMap。这样一来,我们只需要在映射表中查找对应的操作,而不是使用多个 Switch 语句进行条件判断。这种方法能够提高代码的执行效率,并使代码更加简洁。
b. 如果可以预见性的知道后期代码类型会不断新增,可以考虑用策略模式,将控制和处理分离,符合开闭原则
也不是所有的 switch 语句都要重构,有时候 switch 语句只在一个类中使用,就没必要使用了;减少 switch 语句出现 N : 1 : N 的情况:第一个 N 是 switch 的多个 case 分支,其中一个 case 分支里面又干了 N 件事情(调用 N 个函数),应该杜绝这种代码操作。