2016-11-08 67 views
2

編輯:如果ifelse if之一是真的,我只想要執行finally代碼。Java - '最後'相當於if語句

很多很多次,我遇到以下情況:

if (condition1) 
    do stuff 
    do something 
else if (conditon2) 
    do other stuff 
    do something 
else if (condition3) 
    algorithm here 
    do something 

如果有一個finally子句的if語句,我可以減少到:

if (condition1) 
    do stuff 
else if (conditon2) 
    do other stuff 
else if (condition3) 
    algorithm here 
finally 
    do something 

我想找到一些解決方案,其中只需要調用一次do something,而不需要額外的方法,如果聲明或做出如下標誌,會發生一些不合適的地方:

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

難道你不能只在'if'和'else'後面加上'doSomething'嗎? –

+0

爲什麼不放''做點什麼'畢竟如果,它只會執行一次,最後。 – Mritunjay

+4

@Mritunjay,因爲我認爲他不想執行它,如果條件1,條件2和條件3都是假的 – ajb

回答

3

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

的重複代碼是可以接受的,如果它只是一個單一的方法調用和代碼甚至不顯著比沒有變大。

順便說一句,有時開發商走的是更詳細的,故意的路線:聲明special

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 

爲空白final變量具有明顯的優勢,編譯器驗證存在只有一個任務每條代碼路徑都可以達到if(special) do something聲明,從而確保任何情況都不會出現偶然的行爲,即遺忘的分配或稍後會矛盾地覆蓋分配。當將if … else if …鏈轉換爲switch語句時,這一點尤其重要,因爲在這種語句中可能會出現轉場行爲。

+0

而不是「休息」,也許只是一個回報? – Taylor

+0

@泰勒:如果方法只包含此代碼,則可以使用'return'。否則,可能會有後續代碼不應跳過。 – Holger

+0

封裝!使整個事情比使用休息更簡潔,但這是主觀的。 – Taylor

1
if (condition1) 
    do stuff 
else if (conditon2) 
    do other stuff 
else if (condition3) 
    algorithm here 
do something 

,或者如果你必須具備的條件之一,以激活

if(condition1||condition2||condition3) 
    do something 
+0

是的,這個問題有什麼問題,這就是'finally'的問題。 – Mritunjay

+0

也許downvoted沒有任何解釋 –

+2

當你回答Stack Overflow的問題時,你正在教某人如何做某事。如果我參加了一門編程課,老師教我們編寫一系列沒有大括號的if/else塊,我會退出課程。 @毒素,我相信這是你第二次發佈這樣的答案,在過去的一個小時左右,錯過了花括號。 –

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的重複現在消失了。

+0

你是對的,但不幸的是,這仍然屬於我的意思是'有一個變量作爲一個標誌'。 – Hatefiend

+0

甚至是'doSomething(doFinally);'? –

+0

準確地說,我即將發佈。 :D –

5

你的第三個例子:

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變量(用描述性的名稱)的if之前舉行的條件的值,以便您的最後if儘可能簡單。這兩者之間的選擇和你的第一個例子(在每個分支中重複doSomething(),如果它非常簡單,這可能是好的),部分是風格問題,我可能會根據我認爲的不同情況選擇不同的方法在特定情況下最合適。

if聲明的不同分支之間共享代碼的想法是我一直認爲很有用的東西,但我從來沒有見過一種實際做它的語言(如果有的話,語法可能會很困難無論如何理解)。只是很高興我們不再執行程序員在我第一次啓動時所做的事情,這將使if分支中的兩個使用goto跳轉到第三個分支中的公共代碼。

-1

如果這種構造你的方法體結束,你可以使用恢復

{ 
    ... 
    if (condition1) { 
     doStuff1(); 
    } else if (conditon2) { 
     doStuff2(); 
    } else if (condition3) { 
     algorithmHere(); 
    } else 
     return; 

    doCommonTask(); 
}