下面的代码是我的问题的一个示例。我希望简化代码,而不必在不同的switch语句上重复对相同方法的调用。
public void simulate(String given, Status status) {
switch (status){
case A:
simulateA(given);
break;
case B:
simulateA(given);
simulateB(given);
break;
case C:
simulateA(given);
simulateB(given);
simulateC(given);
break;
}
ps 1:调用方法的顺序很重要!
ps 2:我不是在寻找另一种切换的方法,我是在寻找另一种建模问题的方法,可能是在方法中使用某种类组合。
7条答案
按热度按时间eanckbw91#
我不知道你的工作性质
enum
但是,如果有许多模拟调用,可以放弃switch语句,这样做。但你目前的做法没有错。如果您的方法是静态的而不是示例,那么这也会有轻微的变化。这样做的一个优点是,它具有扩展的潜力。有很多其他的方法可以做到这一点。您可以有一个方法引用列表和
enum
参数可以是要按索引调用的方法的变量数组。rkttyhzu2#
在这种情况下,模拟的顺序总是“向下”级联,例如,模拟b是模拟a加上一些额外的。这与遗传模式相匹配,例如,哺乳动物是一种具有某些额外功能的动物。因此,让模拟彼此继承可以修复模式:
请注意,这是脆弱的,因为所有继承树都是脆弱的。另一个解决方案可以通过组合和授权来实现。这称为链:
要示例化链,请使用以下顺序:
这段代码更自然地处理问题陈述,消除了重复,但并不简洁。
bxgwgixi3#
设置状态值到方法调用的Map后,可以使用sortedset或enumset.range获取特定值之后的枚举值:
wnvonmuf4#
另一个要考虑的选项,它避免了
switch
/if
. 根据声明操作的MapStatus
值,该值可与getOrDefault
查找未处理值的默认值:如果要防止丢失/未处理的Map,则应验证Map(如@vgr answer中所示),或使用异常处理程序替换无操作默认值:
lymgl2op5#
假设你是第一个
status
这是一个你可以做的事情:bksxznpy6#
您不需要为所有案例编写simulatea(给定),只需将其移到顶部即可
0pizxfdo7#
您可以尝试switch语句的fallthrough机制。参考这个
在您的示例中,代码可以(未测试):
编辑:
原件(错误):
当读者头脑中有了错误的概念时,上面的代码比所讨论的代码更清晰、更容易阅读。但情况并非总是如此。我的建议是重新构造代码,以消除重复调用和故障。