Java - 'finally'相当于if语句

时间:2016-11-08 04:19:29

标签: java if-statement

编辑:如果其中一个finallyif语句为真,我只希望执行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

5 个答案:

答案 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

这确实简化了您的代码,因为现在重复设置specialtrue

答案 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();
}