2012-08-06 96 views
28

可能重複:
Is it bad to explicitly compare against boolean constants e.g. if (b == false) in Java?如果(布爾==假)與IF(布爾!)

this NotePadProvider sample code,我注意到,筆者選擇的形式:

if (values.containsKey(NoteColumns.CREATED_DATE) == false) { 
     values.put(NoteColumns.CREATED_DATE, now); 
    } 

結束於:

if (!values.containsKey(NoteColumns.CREATED_DATE)) { 
     values.put(NoteColumns.CREATED_DATE, now); 
    } 

第一種形式比更合乎邏輯的形式有優勢嗎?

+4

它更具可讀性。 – 2012-08-06 16:04:56

+10

@Lukas Knuth真的嗎?我會認爲相反... – ateiob 2012-08-06 16:05:24

+0

相關:[與布爾常量進行顯式比較是不好的,例如, if(b == false)in Java?](http://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-eg-if-b-false- i) – BalusC 2012-08-06 16:06:18

回答

51

除了「可讀性」,沒有。它們在功能上等同。

(「可讀性」是加引號,因爲我討厭== false,找到!更具可讀性,但別人不一樣。)

+1

我認爲它甚至超出了可讀性的論點。 ! (爆炸操作員)是爲此目的而創建的。您應該使用它,因爲它可以幫助您以簡潔的方式編寫這些語句。您可以使用更爲有限的操作符編寫代碼,但是您的代碼將從可讀性的角度吸引,並且不會遵循所有人使用的約定。 – user2481095 2017-01-16 22:02:16

5

這是款式的選擇。它至少不會影響代碼的性能,它只是使讀者更加冗長。

3

不,我看不到任何優勢。第二個更爲直截了當。

btw:在JDK源代碼的每個角落均可找到第二種樣式。

4

-第一種選擇是很清楚的,但隨後:第二個是相當考究 -這裏它不是被功能 ....

更多關於coding style。 ..沒有進攻,只是我的看法..

7

大部分是可讀性。當閱讀其他代碼時,它更直觀地閱讀爲不包含密鑰!values.containsKey(NoteColumns.CREATED_DATE)而不是讀包含密鑰爲假(values.containsKey(NoteColumns.CREATED_DATE) == false)

1

第一種形式與返回Boolean並與Boolean.FALSE進行比較的API一起使用時,將永遠不會拋出NullPointerException

第二種形式,與java.util.Map接口使用時,也絕不會因爲它返回一個boolean而不是Boolean拋出NullPointerException

如果你不關心一致的編碼習慣用法,那麼你可以選擇一個你喜歡的編碼習慣,在這個具體的例子中,它並不重要。如果你關心一致的編碼,那麼當你檢查Boolean可能是NULL時,考慮你想要做什麼。

+1

這可能是一個真正有啓發性的答案,如果我只理解你看到一個「布爾」的地方。我看到的只有一個'boolean'。請解釋。 – ateiob 2012-08-06 16:18:28

+0

「在這個具體案例中,這真的沒有關係。」正如你正確地指出的那樣,上面沒有布爾值。我擔心未來的代碼可能會返回給您一個布爾類型,並且可能爲空。如果你相信這會「不會發生」,那麼這個答案就不是很有用。 – Sam 2012-08-06 18:59:46

2

注意:使用ConcurrentMap可以使用更高效的

values.putIfAbsent(NoteColumns.CREATED_DATE, now); 

我更喜歡更簡潔的解決方案,避免像IsTrue運算或IsFalse或它們的方法等。

+0

非常好。我喜歡這個。由於[ConcurrentMap](http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html)不是從[ContentValues]派生的(http://developer.android.com/reference/android/ content/ContentValues.html),並且兩者之間沒有直接的聯繫,您是否有任何建議將傳遞的ContentValues參數轉換爲ConcurrentMap?哦,等等,'ConcurrentMap'是一個**界面**!讓我檢查一下,我從來沒有遇到過'ConcurrentMap'。 – ateiob 2012-08-06 18:13:03

+0

有趣的是,它甚至沒有擴展Map,我不確定它的線程安全。你可以編寫一個'putIfAbsent(ContentValues,NoteColumns.CREATED_DATE,now)'方法。 ;) – 2012-08-06 18:16:36