如何移除大型 if-else-if 链

2022-09-02 00:49:45

可能的重复:
Java 中 if 语句的长列表

我的任务是处理一些代码,并且有一个巨大的if-else-if链(100多个els-ifs)来检查字符串。

有哪些好的技术来更新此代码,以便将if-else-if链缩小到更易于管理的位置。

链条看起来像这样:

if(name.equals("abc")){
    do something
} else if(name.equals("xyz")){
    do something different
} else if(name.equals("mno")){
    do something different
} ......
.....
else{ 
   error
}

答案 1

您可以将每个分支中的代码提取到单独的方法中,然后将这些方法转换为公共基接口的实现(我们称之为)。之后,您可以填写一个,然后查找并执行给定字符串的正确处理程序。HandlerMap<String, Handler>

不幸的是,为接口实现100多个子类需要相当多的样板代码,但目前在Java中没有更简单的方法来实现这一点。将案例实现为 的元素可能会有所帮助 - 这是一个示例。理想的解决方案是使用闭包/ lambdas,但唉,我们必须等到Java 8才能做到这一点......Enum


答案 2

一些选择/想法:

  • 保持原样 - 它没有从根本上破碎,并且相当清晰且易于维护
  • 使用switch语句(如果您使用的是Java 7) - 不确定这是否对您有多大好处
  • 创建字符串到函数对象的哈希映射,其中函数对象将所需的行为实现为方法。那么你的调用代码就是:hashMap.get(name).doSomething();
  • 通过对字符串进行子分组,将其分解为函数调用的层次结构。您可以通过依次获取每个字母来执行此操作,因此一个分支处理所有以“a”开头的名称等。
  • 重构,以便不将名称作为字符串传递,而是传递命名对象。然后你可以做namedObject.doSomething()