避免简单的if / else条件

时间:2018-11-13 09:54:24

标签: java

在我的程序中,我需要检查变量是否等于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());
}

这段代码是如此简单和基本,但是我真的不喜欢它。当然,我可以使用切换条件,但以我的愚见,它只会以不同的方式显示相同的基本功能。

我的问题是:有没有办法以一种优雅且可扩展的方式实现该功能?

仅供参考,我已经发了this个红色帖子,但没有找到适合我问题的答案。

3 个答案:

答案 0 :(得分:13)

我认为,您所链接问题的可接受答案非常适合您。在地图中存储对函数的引用:

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…类不需要公共的超类或接口。

答案 1 :(得分:2)

如果您的PhaseOne / PhaseTwo / PhaseThree类都实现了相同的接口(假设Phase),并且方法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()));

答案 2 :(得分:-1)

另一个选择是为每个阶段创建一个类,并为每个阶段创建一个IPhase接口。 使用所有不同的Phase实例创建一个List<IPhase>。 运行一个循环,如果ID匹配,则执行覆盖的方法。

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
    }
}