2011-03-27 39 views
1

在相同的if語句中檢查null和檢查對象屬性是否是一種好的做法?在相同的if語句中檢查null和檢查對象屬性是否是好的做法

考慮下面的代碼:

if (jamesBlunt != null && jamesBlunt.isReallyBad()) { 
    // Don't buy his records 
} 

這個特殊的代碼是在Java中,我知道從左至右所以在技術上也不會拋出NullPointerException表達式求值,但一般是在這個好習慣任何語言?

+0

謝謝大家,我已經聽了太多的James Blunt的CD和搞砸的問題一點,我的意思是&&不|| – zode64 2011-03-28 00:09:54

回答

1

我假設||是一個錯字,你的意思&& :)

要回答你的問題:它依賴。

jamesBlunt是否有意義爲空?如果不是,那麼這將是更好的做法是這樣的:

void buyARecord(Artist jamesBlunt) { 
    if (jamesBlunt == null) { 
     throw new IllegalArgumentException("James should never be null!"); 
    } 
} 

如果是有一定道理的jamesBlunt爲空,然後你的做法是好的,假設nullisReallyBad意思是一樣的語義。如果它們在語義上意味着不同的事物,那麼你可能不應該把它們合併到一行中。

你確實需要小心其他語言。許多(Java,C++,C#等)的行爲方式都是相同的,但有些可能會從右向左評估或懶惰評估。特別注意像Lisp和Scheme這樣的函數式語言,因爲它們傾向於與面向對象的語言(如Java和C#)有所不同。

+0

所做的更改,您是對的,這要感謝您和其他答覆者,問題終於在正確的格式。在我想到的特定例子中,jamesBlunt是無效的。 – zode64 2011-03-28 00:20:32

3

由於您使用的是OR聲明,如果jamesBlunt爲空,將會有一個NullPointerException。您應該使用and,因爲如果左語句爲false,則整個表達式將爲false。

用途:

if (jamesBlunt != null && jamesBlunt.isReallyBad()) { 
    // Don't buy his records 
} 

當Java 7的出來了,你可以使用快捷鍵

if(jamesBlunt?.isReallyBad() { 
     // Don't buy his records 
} 

但在此之前的null明確的檢查將是最好的做法。 (事實上​​,這將是最好的做法是不使用對象詹姆仕·布朗特...)

+0

是的,所以它的工作原理。我不知道這是否是「良好實踐」,但我經常使用它 - 這比if的兩個級別更方便。如果有人反對的話有很好的理由,會很感興趣。 – MacGucky 2011-03-28 00:00:01

+1

@MacGucky:實際上這是「最佳實踐」,雖然檢查是多餘的,因爲jamesBlunt對象總是爲NULL。 – Chris 2011-03-28 00:10:05

+0

謝謝我的不好。我的意思是從java7 && – zode64 2011-03-28 00:10:33

1

你想用& &,而不是OR。

是的,最好的做法是在相同if語句中檢查null,替代方法(嵌套兩個ifs)很醜,因爲會添加更多縮進。

但之前檢查也行:特別是如果你想做一些錯誤檢查。

1

就我個人而言,我會分開這些。空檢查是人們在函數開始時要做的事情,通常用來驗證函數參數,通常稱爲「守衛子句」。這些檢查通常會引發異常或返回由該函數定義的錯誤代碼。

這些可以導致下面更清潔的代碼,避免了多層次的嵌套。它還可以防止在需要測試的對象上有其他事情時重複空檢查。

相關問題