2011-09-28 83 views
2

我使用PMD來檢查我的代碼。在大多數情況下,它給了我很多有用的提示,但我無法弄清楚在以下情況下可以改進哪些方面。Java可摺疊if語句

原始代碼看起來是這樣的:

if ((getSomething() != null && getSomethingElse() != null) 
    || (getSomething() == null && getSomethingElse() == null)) 
{ 
    ... 
} 

PMD告訴我:

有時是兩個「如果」語句可以用一個布爾短路運營商分離的 條件得到鞏固。

爲簡單起見,我們只需使用a和b作爲布爾變量。那麼這段代碼看起來是這樣的:

if ((!a && !b) || (a && b)) 

這可以轉化爲下列之一:

if ((!a || b) && (a || !b)) 
if (!(a^b)) 

最後

if (a==b) 

所以我簡化我的代碼

if ((getSomething() == null) == (getSomethingElse() == null)) 

然而,PM D不斷抱怨(實際上關於所有三個版本)。這是一個假陽性還是有更好的方式來編寫if條件?

+2

你確定你的代碼中沒有另外的_if_語句嗎? PMD抱怨_two_如果陳述,而不是一個比必要更復雜 – michael667

+0

我想不出更好的最終版本(這是我的代碼)。 * if裏面有什麼* if - 塊裏面有另外一個if嗎? – Bohemian

+0

我剛剛在JSR305規範中發現了@ javax.annotations.Nonnull和@ javax.annotations.Nullable註解。我使用的是'com.google.code.findbugs:1.3.9'中的Google實現。它大大清理了我的代碼,Intellij IDEA auto根據這些註釋生成代碼和警告。 –

回答

3

的問題是不同的東西。 if語句在裏面另一個唯一的代碼,如果(代碼來自驗證方法):

if (...) 
{ 
    ... 
} 
else if (...) 
{ 
    ... 
} 
else if (...) 
{ 
    if ((getSomething() == null) == (getSomethingElse() == null)) 
    { 
     ... 
    } 
} 

什麼PMD消息指,是我可以結合的條件下,最後還有,如果和內如果子句:

if (...) 
{ 
    ... 
} 
else if (...) 
{ 
    ... 
} 
else if (... && ((getSomething() == null) == (getSomethingElse() == null))) 
{ 
     ... 
} 

但是,我不知道,如果我這樣做,是因爲原來的版本似乎更清晰的瞭解。

2
if ((a != null) && (b != null) && (a==b)) 

..although個人而言,我會做的空檢查之前,這個if語句,所以我可以處理一個== NULL和b == NULL的情況下單獨

+0

這是關於分別處理'null'情況的一個很好的建議。通過這種方式,您可以拋出特定的NPE來告訴用戶哪一個是'null'或者以特定方式處理它們。 –

+0

不應該是'|| (A == B)'? – Gandalf

+0

@Gandalf我不這麼認爲....由於JRE處理if語句從左到右查找邏輯真或假,我發佈的if語句將如下評估: 1)'a'是否爲空?是的,向右移動。如果是錯誤的,整個評估不可能是真實的,因此請停止評估。 2)'b'是否爲空?是的,向右移動。如果是錯誤的,整個評估不可能是真實的,因此請停止評估。 3)現在我們知道'a'和'b'都不是null,我們可以安全地評估'a == b' – claymore1977

1

問題是大塊條件很難推理。

OTOH,不是每一個警告PMD發出需要注意的 - 考慮投資回報率。是否值得重構或重組以使其更清潔?相同的功能可以以不同的方式處理嗎?

如果不值得,請不要打擾。

+0

我不認爲我會改變我的代碼,但它仍然是有趣的發現,什麼可以「改善」。 – martin

+0

即使我們聽到建議並立即忽略它,它總是這樣;) –