【问题标题】:if (boolean == false) vs. if (!boolean) [duplicate]if (boolean == false) 与 if (!boolean) [重复]
【发布时间】:2012-08-03 15:16:41
【问题描述】:

可能重复:
Is it bad to explicitly compare against boolean constants e.g. if (b == false) in Java?

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);
    }

第一种形式比逻辑更合理的形式有什么优势吗?

【问题讨论】:

  • 更具可读性。
  • @Lukas Knuth 真的吗?我会认为相反...
  • 在第一个示例中,您乍一看预期的结果应该是错误的。在后一个示例中,您只能猜测预期的内容。也很容易漏掉感叹号。
  • if (b==false) 更冗长且难以阅读。如果你想让它更冗长,你可以使用if (b == false == true == true)(借用自stackoverflow.com/questions/2661110
  • 如何if(b != true) 完成事情。来自 C-Background,为了清晰起见,我更喜欢详细版本,但是(假设编译器不会优化它)详细方法会创建更多处理:Read valaue oneread value twocompareproceed according to output 而不是@987654333 @proceed according to value

标签: java boolean boolean-logic boolean-expression


【解决方案1】:

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

(“可读性”用引号引起来,因为我讨厌== false,发现! 可读性更强。但其他人则不然。)

【讨论】:

  • 我认为它甚至超出了可读性的论点。 ! (bang 运算符)就是为此目的而创建的。您应该使用它,因为它可以帮助您以简洁的方式编写这些语句。您可以使用更有限的运算符范围编写代码,但是从可读性的角度来看,您的代码会很糟糕,并且不会遵循每个人都使用的约定。
【解决方案2】:

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

【讨论】:

  • 这是 100% 的偏好
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    -第一个选项很清楚,但是第二个很优雅...无意冒犯,这只是我的观点..

    【讨论】:

      【解决方案5】:

      没有。我看不出有什么优势。第二个更严格。

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

      【讨论】:

        【解决方案6】:

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

        values.putIfAbsent(NoteColumns.CREATED_DATE, now);
        

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

        【讨论】:

        • 优秀。我喜欢这个。由于ConcurrentMap 不是从ContentValues 派生的,并且两者之间没有直接联系,您有什么建议将传递的ContentValues 参数转换为ConcurrentMap?哦等等,ConcurrentMap 是一个接口!让我检查一下,我以前从未遇到过ConcurrentMap
        • 有趣,它甚至没有扩展 Map,我不确定它的线程安全。你可以写一个putIfAbsent(ContentValues, NoteColumns.CREATED_DATE, now) 方法。 ;)
        【解决方案7】:

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

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

        如果您不关心一致的编码习惯用法,那么您可以选择您喜欢的那个,在这个具体的案例中,这并不重要。如果您确实关心编码的一致性,那么当您检查可能是NULLBoolean 时,请考虑您想要做什么。

        【讨论】:

        • 如果我只知道您在哪里看到 Boolean,这可能是一个真正有启发性的答案。我看到的只有boolean。请解释一下。
        • “在这个具体的案例中,它真的没关系。”正如您正确指出的那样,上面没有显示布尔值。我担心的是未来的代码可能会返回一个布尔类型并且可能为空。如果您相信这会“永远不会发生”,那么这个答案就不是很有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 2013-05-21
        • 2016-06-02
        • 2018-09-19
        • 1970-01-01
        相关资源
        最近更新 更多