我有一個方法需要兩個Doubles
a
和b
(注意大寫「D」)並計算差異。如果只有一個參數是null
,結果應爲999999
,否則返回兩個數字之間的差值。FindBugs:雙重引用的可疑比較
以下(工作)代碼在FindBugs中給我一個「可怕的」警告,我通常會盡量避免代碼中出現高排名的警告。但是,我認爲代碼既簡短又可讀,而我認爲的所有其他內容都使其不易讀。恕我直言,使用==
在這個的情況下是完全正確的。
public double foo(Double a, Double b) {
return a == b ? 0 : (a != null && b != null) ? b - a : 999999;
}
而對於該行的FindBugs的報告:
缺陷:在 Main.foo雙引用的可疑的比較(雙,雙)
此方法會比較使用所述兩個參考值==或!=運算符, 其中,使用equals()方法比較此類型實例的正確方法通常是 。有可能創建不同的實例 ,它們是相同的,但不會比較爲==,因爲它們是不同的 對象。這通常應不通過 參考進行比較的種類的實例是java.lang.Integer中,java.lang.Float中等
信心:高,等級:最可怕的(1)圖樣:RC_REF_COMPARISON類型: RC,類別:正確性(正確)
任何想法如何重寫這個代碼乾淨,簡單沒有警告?
沒有直接關係,但像PMD其他代碼檢查工具會抱怨 「幻數」 你有沒有(999999) ,因爲它不清楚它的含義,如果你不得不在其他地方使用它,很容易輸入錯誤(Harmlezz的答案爲9999,例如:-))。更好地使用像DIFFERENCE_WHEN_NULL或MAX_DIFFERENCE這樣有意義的名稱的常量 –
是的,這當然是正確的。 – Axel
想了一會兒,我想你的代碼是正確的,如果你希望'foo(null,null)'產生'0.0d'的結果。通常,使用'=='比較'Double'對象表示程序員錯誤('=='比較引用,而不是'Double'的值!)。所以你可能會忽略FindBugs這個特殊情況的警告。 –