39

可能重复:
明确比较布尔常量是否很糟糕,例如 Java 中的 if (b == false)?

这个 NotePadProvider 示例代码中,我注意到作者选择了表单:

    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

7 回答 7

63

除了“可读性”之外,没有。它们在功能上是等效的。

(“可读性”用引号引起来,因为我讨厌== false并且发现!可读性更高。但其他人则没有。)

于 2012-08-06T16:05:30.020 回答
8

主要是可读性。在阅读其他代码时,阅读为NOT CONTAINS KEY !values.containsKey(NoteColumns.CREATED_DATE)而不是阅读CONTAINS KEY IS FALSE 更直观(values.containsKey(NoteColumns.CREATED_DATE) == false)

于 2012-08-06T16:10:11.223 回答
6

这是一种风格选择。它至少不会影响代码的性能,它只会让读者更加冗长。

于 2012-08-06T16:05:11.720 回答
6

-这里更多的coding style是关于功能......

-一个选项非常明确,但第二个选项非常优雅......没有冒犯,这只是我的观点......

于 2012-08-06T16:08:04.593 回答
4

不,我没有看到任何优势。第二个更严格。

顺便说一句:在 JDK 源代码的每个角落都可以找到第二种风格。

于 2012-08-06T16:07:34.703 回答
3

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

values.putIfAbsent(NoteColumns.CREATED_DATE, now);

我更喜欢不那么冗长的解决方案,并避免使用 IsTrue 或 IsFalse 之类的方法。

于 2012-08-06T16:31:37.887 回答
1

第一种形式与返回Boolean并与 Boolean.FALSE 比较的 API 一起使用时,永远不会抛出NullPointerException.

第二种形式,当与java.util.Map接口一起使用时,也永远不会抛出 a NullPointerException,因为它返回 aboolean而不是 a Boolean

如果您不关心一致的编码习惯用法,那么您可以选择您喜欢的那个,在这种具体情况下,这并不重要。如果您确实关心一致的编码,那么在检查Boolean可能是NULL.

于 2012-08-06T16:11:32.907 回答