编辑:如果其中一个finally
或if
语句为真,我只希望执行else if
代码。
很多次,我遇到以下情况:
if (condition1)
do stuff
do something
else if (conditon2)
do other stuff
do something
else if (condition3)
algorithm here
do something
如果if语句中有finally
子句,我可以将其缩减为:
if (condition1)
do stuff
else if (conditon2)
do other stuff
else if (condition3)
algorithm here
finally
do something
我正在尝试找到一些解决方案,其中do something
只需要调用一次,而不需要另外创建一个方法,在if语句中做一些奇怪的地方,或者制作一个类似的标志:
boolean special = false;
if (condition1)
do stuff
special = true;
else if (conditon2)
do other stuff
special = true;
else if (condition3)
algorithm here
special = true;
if (special) // <--- bad solution, doesn't simplify anything
do something
答案 0 :(得分:6)
虽然没有特殊构造可以执行您想要执行的操作,但您可以在最终else
分支中使用单个分配重写最后一次尝试:
boolean doFinally = true;
if (condition1)
do stuff
else if (conditon2)
do other stuff
else if (condition3)
algorithm here
else
doFinally = false;
if (doFinally)
do something
这确实简化了您的代码,因为现在重复设置special
到true
。
答案 1 :(得分:5)
你的第三个例子:
ViewControllerB
实际上是一个非常常见的习语,只要你给UITableViewCell
一个描述性的名字(在现实生活中,那就是;我不希望这里有一个描述性的名字),它没有任何“坏”。 。但是,这可能是最好的:
boolean special = false;
if (condition1) {
doStuff1();
special = true;
} else if (conditon2) {
doStuff2();
special = true;
} else if (condition3) {
algorithmHere();
special = true;
}
if (special) {
doSomething();
}
条件是如果条件复杂或可能涉及副作用,您应该在special
之前定义if (condition1) {
doStuff1();
} else if (conditon2) {
doStuff2();
} else if (condition3) {
algorithmHere();
}
if (condition1 || condition2 || condition3) {
doSomething();
}
变量(带有描述性名称)以保存条件的值,以便您的最后boolean
尽可能简单。这两者之间的选择和你的第一个例子(在每个分支中重复doSomething(),如果它非常简单可能没问题)部分是风格问题,我可能会根据我认为的不同情况选择不同的方法在特定情况下最合适。
在if
语句的不同分支之间共享代码的想法是我一直认为有用的东西,但是我从未见过实际做过的语言(如果有的话,语法会反正可能很难理解)。很高兴我们不再做程序员在我刚开始时所做的事情,这将是两个if
分支使用if
跳转到第三个分支中的公共代码。
答案 2 :(得分:5)
Java有一种语法允许在没有标志变量的情况下实现这一点,即
doFinalAction: {
if (condition1)
do stuff
else if (conditon2)
do other stuff
else if (condition3)
algorithm here
else
break doFinalAction;
do something
}
但在使用之前你应该三思而行。许多开发人员并不熟悉这一点,而且大多数时候你并不是在为你编程。有些人认为,它过多地提醒他们goto
陈述。
更简洁的方法就是将“做某事”放入方法中,例如doSomething()
并明确称呼它:
if (condition1) {
do stuff
doSomething();
}
else if (conditon2) {
do other stuff
doSomething();
}
else if (condition3) {
algorithm here
doSomething();
}
如果只是单个方法调用,代码重复是可以接受的,并且代码甚至不比没有代码的变量大得多。
顺便说一句,有时开发人员会更加冗长,故意:
final boolean special;
if (condition1) {
do stuff
special = true;
}
else if (conditon2) {
do other stuff
special = true;
}
else if (condition3) {
algorithm here
special = true;
}
else special=false;
if (special)
do something
将special
声明为空final
变量具有明显的优势,即编译器会验证每个代码路径中只有一个可以到达if(special) do something
语句的赋值,从而确保任何情况都不能表现出任何意外的行为,即遗忘的作业或后来的作品被反复覆盖。在将if … else if …
链转换为switch
语句时,这一点尤为重要,因为可能存在跌倒行为。
答案 3 :(得分:1)
if (condition1)
do stuff
else if (conditon2)
do other stuff
else if (condition3)
algorithm here
do something
或者如果您必须具有一个激活条件
if(condition1||condition2||condition3)
do something
答案 4 :(得分:-2)
如果此构造是方法体的结尾,则可以使用return
{
...
if (condition1) {
doStuff1();
} else if (conditon2) {
doStuff2();
} else if (condition3) {
algorithmHere();
} else
return;
doCommonTask();
}