Java - 'finally'相当于if语句

Hat*_*end 2 java if-statement

编辑:我只希望在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
Run Code Online (Sandbox Code Playgroud)

如果finallyif语句有一个条款,我可以将其减少为:

if (condition1)
    do stuff
else if (conditon2)
    do other stuff
else if (condition3)
    algorithm here
finally
    do something
Run Code Online (Sandbox Code Playgroud)

我试图找到一些解决方案,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
Run Code Online (Sandbox Code Playgroud)

das*_*ght 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
Run Code Online (Sandbox Code Playgroud)

这确实简化代码,因为设置的重复specialtrue现在已经没有了.


ajb*_*ajb 5

你的第三个例子:

boolean special = false;

if (condition1) {
    doStuff1();
    special = true;
} else if (conditon2) {
    doStuff2();
    special = true;
} else if (condition3) {
    algorithmHere();
    special = true;
}
if (special)  {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

实际上是一个非常常见的习语,只要你给出special一个描述性的名字(在现实生活中,那就是;我不希望这里有一个描述性的名字).但是,这可能是最好的:

if (condition1) {
    doStuff1();
} else if (conditon2) {
    doStuff2();
} else if (condition3) {
    algorithmHere();
}
if (condition1 || condition2 || condition3)  {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

条件是如果条件复杂或可能涉及副作用,您应该booleanif保持条件值之前定义变量(带有描述性名称),以便您的姓氏if尽可能简单.这两者之间的选择和你的第一个例子(在每个分支中重复doSomething(),如果它非常简单可能没问题)部分是风格问题,我可能会根据我认为的不同情况选择不同的方法在特定情况下最合适.

if语句的不同分支之间共享代码的想法是我一直认为有用的东西,但我从未见过实际做过的语言(如果有的话,语法可能很难理解).很高兴我们不再做程序员在我第一次启动时所做的事情,这将是两个if分支使用a goto跳转到第三个分支中的公共代码.


Hol*_*ger 5

Java的语法允许在没有标志变量的情况下实现此目标,即

doFinalAction: {
    if (condition1)
        do stuff
    else if (conditon2)
        do other stuff
    else if (condition3)
        algorithm here
    else
        break doFinalAction;
    do something
}
Run Code Online (Sandbox Code Playgroud)

但使用前请三思。许多开发人员对此并不熟悉,并且大多数时候您并不是一个人在为自己编程。有人认为,这使他们想起了这个goto说法。

一种更清洁的方法是将“做某事”放入方法中,例如doSomething(),并明确地调用它:

if (condition1) {
    do stuff
    doSomething();
}
else if (conditon2) {
    do other stuff
    doSomething();
}
else if (condition3) {
    algorithm here
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

如果代码重复仅仅是一个方法调用,并且代码甚至不比没有该方法的变体大很多,则可以接受代码重复。

顺便说一句,有时开发人员会故意走得更冗长:

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
Run Code Online (Sandbox Code Playgroud)

声明special为空final变量具有明显的优势,即编译器将验证每个代码路径中确实有一个可以到达该if(special) do something语句的赋值,从而确保任何情况都不会出现偶然的行为,即,遗忘的赋值或该赋值被覆盖矛盾的是后来。在将if … else if …链转换switch为可能发生掉落行为的语句时,这一点尤其重要。