我有一个很大的Ifs列表,我想将它更改为switch语句。目前,它看起来像这样:开关情况下的多个值/转换ifs到switch语句
if(x == 1){
...
}
if(x == 2){
...
}
if(myArray.contains(x)){
...
}
实际上它比这更长一点,但它是第三,如果在混淆我的例子 - 我该如何改变这种状况围绕得到它的开关工作,或它甚至有可能吗?
我有一个很大的Ifs列表,我想将它更改为switch语句。目前,它看起来像这样:开关情况下的多个值/转换ifs到switch语句
if(x == 1){
...
}
if(x == 2){
...
}
if(myArray.contains(x)){
...
}
实际上它比这更长一点,但它是第三,如果在混淆我的例子 - 我该如何改变这种状况围绕得到它的开关工作,或它甚至有可能吗?
你可以做这样的事情,但根据您的代码可能退出条件因人而异:
switch (x) {
case 1:
...
break;
case 2:
...
break;
case 3:
case 4:
... multi-case
break;
default:
if(myArray.contains(x)){
...
}
}
您只能在x值上开关。这意味着最后一个条件将不会是交换机的一部分:
switch(x) {
case 1:
...
break;
case 2:
...
break;
}
if(myArray.contains(x)){
...
}
是的,这是可能的。 switch语句将使它更简洁,更易于维护。你必须担心x
,因为它必须是编译时常量。
switch(x) {
case 1:
doSomething();
break();
case 2:
doSomethingElse();
break();
default:
if(myArray.contains(x)){
}
//etc...
}
这看起来不太面向对象。
尝试使用“替换条件与多态性” http://martinfowler.com/refactoring/catalog/replaceConditionalWithPolymorphism.html
一个地图可以帮你做一些查询,如果你需要从int到自定义对象转换重构你的代码。
switch语句只能用于测试x的平等
所以,如果not equality conditions
像(if(myArray.contains(x))
)一定要来结尾,那么您可以复制粘贴到交换机的默认部分
它看起来这样
switch (x) {
case 1: ...; break;
case 2: ...; break;
default: if(myArray.contains(x)) ...
}
如果not equality conditions
将需要在中间,那么它不可能使用开关。
参考:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
+1。非常好的答案。 –
这也略有不同:开关/箱是一个'if' ...'否则if'。在其中x在“then”块语句中被修改的情况下,整体行为将会不同。 – rds
与问题中的前两个ifs不同,即使前面的一个也是如此,第三个仍然可以是真的。 'x'不能同时等于'1'和'2',但它可以等于'1'并且同时包含在'myArray'中。将if语句移入'case'语句'default'可能不是正确的解决方案。 –
对不起,我应该澄清 - 数组中的值将永远不会匹配我检查的其他任何内容,所以这不是问题。尽管如此。 – Steve