在我的程序中,我需要检查变量是否等于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个红色帖子,但没有找到适合我问题的答案。
答案 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());
用T
和U
的类型替换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
}
}