陷阱 - 使用 Yoda 表示法來避免 NullPointerException

StackOverflow 上釋出的很多示例程式碼包括這樣的程式碼段:

if ("A".equals(someString)) {
    // do something
}

someStringnull 的情況下,這確實防止避免可能的 NullPointerException。此外,有爭議的是

    "A".equals(someString)

比以下更好:

    someString != null && someString.equals("A")

(它更簡潔,在某些情況下它可能更有效。但是,正如我們在下面提到的那樣,簡潔可能是負面的。)

然而,真正的陷阱是使用 Yoda 測試來避免 NullPointerExceptions 作為習慣問題。

當你寫 "A".equals(someString) 時,你實際上是做得好的情況下,someString 恰好是 null。但另一個例子( 陷阱 - 製造好意外的零點 )解釋說,製作好null 值可能因各種原因而有害。

這意味著尤達的條件不是最佳實踐 1 。除非預期 null,否則最好讓 NullPointerException 發生,以便你可以獲得單元測試失敗(或錯誤報告)。這允許你查詢並修復導致意外/不需要的 null 出現的錯誤。

Yoda 條件僅應用於預期 null 的情況,因為你正在測試的物件來自一個記錄為返回 null 的 API。並且可以說,使用表達測試的一種不那麼漂亮的方式可能會更好,因為這有助於向正在審查你的程式碼的人強調 null 測試。

1 - 根據維基百科“最佳編碼實踐是軟體開發社群隨著時間的推移學到的一套非正式規則,可以幫助提高軟體質量。” 。使用 Yoda 表示法並不能實現這一點。在很多情況下,它會使程式碼變得更糟。