当前位置: 首页 > 知识库问答 >
问题:

避免简单的 if/else 条件 [重复]

邓子濯
2023-03-14

在我的程序中,我需要检查变量是否等于1、2或3,并根据结果执行不同的方法:

if (phase.equals("1")) {
    PhaseOne.performPhase(inputParser.getSource(), inputParser.getTarget());
} else if (phase.equals("2")) {
    PhaseTwo.performPhase(inputParser.getSource(), inputParser.getTarget());
} else {
    PhaseThree.performPhase(inputParser.getSource(), inputParser.getTarget());
}

这段代码非常简单和基本,但我真的不喜欢它。当然,我可以使用开关条件,但以我的拙见,它只会以不同的方式显示相同的基本功能。

我的问题是:有没有一种优雅的、可扩展的方式来实现功能?

仅供参考,我已经红了这篇文章,但我没有找到适合我问题的答案。

共有3个答案

魏健柏
2023-03-14

另一种选择是为每个阶段创建一个类,并为它们创建一个I阶段接口以供实现。创建一个列表

public interface IPhase {
    public void performPhase();
    public String getId();
}

for (IPhase phase : phasesList){
    if (phase.equals(phase.getId())){
        phase.performPhase();
        // either break or continue the loop
    }
}

栾弘新
2023-03-14

如果您的PhaseOne/PhaseTwo/PhaseThree类都实现了相同的接口(比方说 performPhase,那么您可以执行以下操作:

final Phase targetPhase;
switch(phase) {
    case "1": targetPhase = myInstanceOfPhaseOne; break;
    case "2": targetPhase = myInstanceOfPhaseTwo; break;
    case "3": targetPhase = myInstanceOfPhaseThree; break;
    default: throw new IllegalStateException("Unrecognised phase "+phase);
}
targetPhase.performPhase(inputParser.getSource(), inputParser.getTarget()));
干浩然
2023-03-14

在我看来,关于您的链接问题的公认答案非常适合您。在地图中存储对函数的引用:

Map<String,BiConsumer<T,U>> map = new HashMap<>();
map.put("1",PhaseOne::performPhase);
map.put("2",PhaseTwo::performPhase);
map.put("3",PhaseThree::performPhase);
map.get(phase).accept(inputParser.getSource(), inputParser.getTarget());

TU 替换为 inputParser.getSource() 和 inputParser.getTarget() 的类型。

使用这种方法,Phase…类不需要公共的超类或接口。

 类似资料:
  • 我读过很多关于代码重构和避免if-else语句的主题。实际上,我有一个类,我使用了很多if-else条件。 更多细节:我正在使用pull解析器,在soap响应的每一行,我会检查是否有我感兴趣的标签,如果没有,请检查另一个标签等: 现在,我想用别的东西,而不是那些if else条件,但我不知道是什么。 你能给我举个例子吗?

  • 我在枚举中有6个值,使用6 if else是一种很糟糕的做法。我们能以更好的方式实现这一点吗?下面是我的场景: 我在考虑switch,但并没有太大的区别,我还需要根据某些参数在doA()内返回一个布尔值。 提前谢谢。

  • Go语言的条件判断结构也很简单。 package main import "fmt" func main() { // 基本的例子 if 7%2 == 0 { fmt.Println("7 is even") } else { fmt.Println("7 is odd") } // 只有if条件的情况 if 8%4

  • 我想我可以做一些 但结果是语法不正确

  • 我目前正在了解React Native中的if-else if-else语句的语法。下面是我理解的一个简单的if-else条件: 但是,当添加另一个条件来生成if-else if-else语句时,我遇到了问题。 如果有人能指出我的缺点,我将不胜感激!

  • 主要内容:if else 如何判断表达式是否成立前面我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为 顺序结构。 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。 在 Python 中,可以使用 if else 语句对条件进行判断,然后根据不同的结果执行不同的代码,这称