2012-12-24 27 views
2

一些人,通常是那些來自一個C的背景下,代碼的測試爲null這樣的:爲什麼人們使用if(null == var)風格測試?

if (null == someVar) 

的信念,即「正常」的風格

if (someVar == null) 

可能會不小心被編碼成

if (someVar = null) 

這會在不經意間分配一個null而不是測試對於null

但是,如果錯誤編碼如if (someVar = null)發生:

  1. 爲了編譯,唯一的類型someVar可以是Boolean
  2. 如果它沒有編譯和被執行,它會拋出一個NullPointerException


爲什麼不把這些人認識到「防禦性」(即滾珠絲槓)風格並不在所有幫助,因爲一個錯誤編碼或者不會編譯或不會運行!?

作爲性能問題,編碼if (null == someVar)的執行速度實際上稍慢 - 一個指令的執行速度要慢一些。原因是必須將null壓入堆棧進行比較,而「正常」樣式使用特殊的「is null」指令。


我知道...不是一個真正的問題。更多的咆哮。但我想把它放在那裏。 Upvote如果你也認爲他們「不夠有見地」。

但是,如果你確實知道答案,我想聽聽它。

+2

首選項?或者他們認爲他們是尤達。 http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html –

+0

正則表達式涉及'null',剩餘的yoda條件?這將是不一致的。 –

+5

你真的回答了你自己的問題 - 這是因爲他們來自的語言*確實允許不按照他們現在使用的語言編譯的作業 - 所以他們需要根據他們的語言重新學習使用。 – Fenton

回答

8

因爲他們帶回這個習慣從C,其中

if (someInteger = 0) 

是有效的代碼,因爲C沒有布爾型,但只有整數(0是假的,和所有其他整數爲真)。

if (somePointer = NULL) 

也是有效的,因爲在C,NULL是0

所以,在C,這個結構是有道理的。

注意,在Java中,還可以做

if (b = true) 

代替

if (b == true) 

的時候當然會出現這種錯誤,一個優秀的Java開發人員永遠不會寫上面,但是會使用

if (b) 
+0

+1實際上,這與這個「問題」所預期的答案差不多。 – Bohemian

+0

你可能有興趣知道'if(null == var)'比'if(var == null)'執行起來要慢' - 參見question編輯 – Bohemian

3

寫作if (null == someVar)沒有問題,爲什麼不呢?對於從C/C++背景中採用這種約定的人來說,爲Java保持相同的約定並不是一個壞主意;特別是如果他們仍然用C/C++編寫的話;否則他們最終不得不對兩種語言使用兩種不同的約定,而不是使用一種通用的約定。

簡單的習慣問題沒有任何真正的不良副作用。

0

它有時到範圍變量有用以這樣的方式!

if(std::shared_ptr<X> p = q.lock()) 
{ 
    // q is valid, I can now use p. 

    p->DoSomething(); 
} 

q.lock()= 0的計算結果爲TRUE。 q.lock()== 0的計算結果爲FALSE。上面給出的編碼風格會使意圖明確。然而,現在編譯器在發現意外任務時非常聰明,所以它並不是真的有必要。過去情況並非如此。

+0

僅供參考,這是一個* java *問題 – Bohemian

+0

引用C語言(也是C++)。這是我經常看到它的地方,並解釋它的起源。 – Robinson

相關問題