2012-08-06 117 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