2017-04-27 54 views
5

有人推薦方法2對於null-檢查,但我不確定它背後的原因是什麼,爲什麼它應該是首選?最好的方法來檢查null?

Date test1 = null; // test1 can be any object like String instead of Date 
if (test1 != null) { 
    System.out.println("Test"); 
} 

方法2: -

Date test1 = null; 
if (null != test1) { 
    System.out.println("Test"); 
} 
+0

請參閱後的描述http://stackoverflow.com/questions/10983573/checking-for-null-what-order方法2更好的原因是,你會得到一個編譯器錯誤,當你失蹤一個「=」。 –

+4

@ReneM。但是我們在這裏討論java。即使'if(test = null)'會給編譯器錯誤,因爲這不是布爾值... – Imus

+0

@ReneM。這是一個不平等的檢查,如果你忘了等號你得到'test1! null' – Jens

回答

3

Java 7中引入的java.lang.Objects漂亮的小幫手方法,如requireNonNull()。 Java 8增加了幾個,特別是isNull()nonNull()。它們旨在用於stream()操作;但當然,它們並不侷限於這種情況。

因此,一種替代方案將僅僅依靠這些新方法來做出這樣的決定。簡潔,可讀「的標準,並且防止您在各處重複您自己的檢查,並且零介紹和錯誤類型的機會當然,從另一個方法調用的最小開銷。數百萬次 - 無論如何它都會被打亂;然後這樣的小方法可能很容易被內聯

+0

當然,我本人沒有答案。 – Kayaman

+1

仍然:感謝您的寶貴意見。 3天后,每次250人。我最近無法得出任何重要的答案。所以我至少要努力完善那些最初得到半正確答案的人......希望某些「更好」的問題在某些時候再次出現;-) – GhostCat

-1

這裏有兩個合理的理由:第一個是C的保留。在C:

if(x = NULL) { ... } 

...(注單=)是錯誤的一些開發商可能會不小心讓。

if(NULL = x) { ... } 

...導致編譯器錯誤。所以如果你習慣於先把null放在第一位,那麼就很難犯這個錯誤。

然而這種邏輯並不適用於!=,所以唯一的理由繼續把null首先是一致性。

...而在Java中if(x = null)也是一個編譯器錯誤,因爲Java不會將賦值賦值給值。

有在把「預期」前的「實際」是常見的另一種情況,那就是:

if("expected string".equals(string)) { ... } 

因爲"expected string"絕對不是null,這不能NullPointerExceptionstring == null,而string.equals("expected string")會。

所以,一些程序員養成了把預期值放在第一位的習慣。

我自己喜歡的東西是類似於英語句子的東西,對我來說:if(x == null)在這方面更好。

我們用來捕捉小錯誤和拼寫錯誤的一些技巧,通過單元測試習慣,首先避免空值以及明智地使用變量,使得它們變得不那麼必要。

+0

1.'if(x = null)'也是一個錯誤在Java中。 2. OP的變量是一個不是字符串的日期 – Jens

+0

@Jens 1.已經編輯來指出它是一種C語言習慣。 2.重點在於字符串習語導致程序員的習慣 - 而且該技術無論如何都適用於任何對象類型。 – slim

+0

2.如何運作OP的問題:'if(null!= test1){' – Jens

2

這裏沒有真正的區別。這兩個條件將以相同的方式工作討論從Yoda conditions最有可能來到我們寫:

null   ==   temp1 
literal comparison variable 

這使我們無法作出書面=(賦值運算符)的錯誤,而不是==(比較)時,我們可以用代碼落得像if (foo = 42)這在某些語言編譯罰款造成邏輯錯誤可能很難找到(尤其是新手程序員)。

但在你的情況下,你不需要使用該構造。有在免得兩個原因:

  1. 您使用!===,所以你會寫的只是=代替!=
  2. 在Java if (expression)指望expression返回boolean值機率很低,所以即使你誤寫了= null這樣的代碼也會不能編譯,因爲表達式會返回null。這可以防止我們使用這種錯字來運行代碼。在Java中

    尤達條件纔有意義boolean表情像if (stop == true),但即使是這樣,而不是寫if (true == stop)我們應該直接跳過== true(或==false)部分,因爲我們已經有布爾值。所以我們應該寫if (stop)if (!stop)

使用這樣的風格使得當你在不同的語言編程意識,要通過使用一種風格,這有助於在一個語言,同時不會導致其他語言的問題(甚至是簡化你的生活如果這不是真的有必要的話)。

仍然值得知道哪裏的結構/樣式是有用的或必要的,哪裏不是,因爲每種語言都可能有更好的方式來處理這個問題,就像other answerObjects.nonNull中已經提到的那樣。

相關問題