【问题标题】:Best way to check null? [duplicate]检查空值的最佳方法? [复制]
【发布时间】:2017-04-30 19:37:10
【问题描述】:

有人为null-check推荐方法2,但我不确定它背后的原因是什么,为什么应该首选它?

Date test1 = null; // test1 can be any object like String instead of Date
if (test1 != null) {
  System.out.println("Test");
}

方法二:-

Date test1 = null;
if (null != test1) {
  System.out.println("Test");
}

【问题讨论】:

  • 见帖子描述stackoverflow.com/questions/10983573/… 方法2更好的原因是当你缺少一个“=”时会出现编译错误。
  • @ReneM。但是我们在这里谈论的是java。即使if(test=null) 也会给出编译器错误,因为这不是布尔值...
  • 或者从 java 1.7 开始:if (Objects.isNull(whatever)) ... 更喜欢 oneliner!
  • 真的是复制品吗?标题暗示了它,但问题是关于不等于而不是关于等于
  • @GhostCat 是Java8 docs.oracle.com/javase/8/docs/api/java/util/… 还有一个nonNull函数

标签: java


【解决方案1】:

Java 7 引入了 java.lang.Objects 以及不错的小助手方法,例如 requireNonNull()。 Java 8 又增加了一些,尤其是isNull()nonNull()。它们旨在用于 stream() 操作;但当然,它们不限于这种情况。

因此,另一种选择是简单地依靠这些新方法来做出此类决定。简洁、易读、“标准”;并防止您在所有地方重复自己的检查。并且引入和输入拼写错误的机会为零。当然,调用另一个方法的开销最小。另一方面:如果您的方法被调用数百万次 - 无论如何它都会被 JIT 化;然后这些小方法可能很容易被内联。

【讨论】:

  • 当然,我对答案本身没有意见。
  • 仍然:感谢您的宝贵反馈。 3 天后,每次 250 次;我最近无法得到任何重要的答案。因此,我至少会努力使那些我最初猜对了一半的人做到完美……希望在某个时候会再次出现一些“更好”的问题;-)
【解决方案2】:

这里没有真正的区别。这两种情况都将以相同的方式工作。讨论最有可能来自Yoda conditions 我们写的地方:

 null          ==         temp1
literal    comparison    variable 

这可以防止我们错误地编写 =(赋值运算符)而不是 ==(比较),因为我们最终可能会得到像 if (foo = 42) 这样的代码,在某些语言中编译得很好,导致逻辑错误可能很难找到(尤其是新手程序员)。

但在您的情况下,您不需要使用该构造。至少有两个原因:

  1. 您使用的是!= 而不是==,因此您只写= 而不是!= 的可能性很小

  2. 在 Java 中 if (expression) 期望 expression 返回 boolean 值,因此即使您错误地编写了 = null 这样的代码也将无法编译,因为表达式将返回 null。这会阻止我们运行带有这种拼写错误的代码。

    Java 中的 Yoda 条件仅对 boolean 这样的 if (stop == true) 表达式有意义,但即使这样,我们也应该跳过 == true(或 ==false)部分,而不是写 if (true == stop),因为我们已经有了布尔值。所以我们应该写if (stop)if (!stop)

当您使用不同的语言进行编程时,使用这种风格是有意义的,并且您希望通过使用一种有助于一种语言的风格来简化您的生活,同时又不会在其他语言中引起问题(即使它不是那里真的很有必要)。

仍然值得知道构造/样式在哪里有用或必要,在哪里没有,因为每种语言可能有更好的方法来处理这个问题,就像other answerObjects.nonNull 中已经提到的那样。

【讨论】:

    【解决方案3】:

    这有几个合理的原因。第一个是 C 的保留。在 C 中:

    if(x = NULL) { ... }
    

    ...(注意单个=)是一些开发人员可能不小心犯的错误。

    if(NULL = x) { ... }
    

    ... 导致编译器错误。因此,如果您习惯于将null 放在首位,则更难犯此错误。

    然而此逻辑不适用于!=,因此继续将null 放在首位的唯一原因是为了保持一致性。

    ...在 Java 中 if(x = null) 也是编译器错误,因为 Java 不会将赋值评估为值。

    还有一种情况,把“预期”放在“实际”之前很常见,那就是:

    if("expected string".equals(string)) { ... }
    

    因为"expected string" 绝对不是null,所以string == null 时不能NullPointerException,而string.equals("expected string") 会。

    因此,一些程序员养成了将期望值放在首位的习惯。

    我自己的偏好是读起来类似于英文句子的东西,对我来说:if(x == null) 在这方面更好。

    通过单元测试习惯、首先避免空值以及明智地使用final 变量,我们用来捕捉小错误和拼写错误的一些技巧变得不那么必要了。

    【讨论】:

    • 1. if(x=null) 在 Java 中也出现错误。 2. OP的变量是日期而不是字符串
    • @Jens 1. 已经编辑指出这是一个 C 习惯,它被继承了。 2. 关键是字符串习语会导致程序员的习惯——而且该技术无论如何都适用于任何对象类型。
    • 以及 2. 如何解决 OP 的问题:if (null != test1) {
    猜你喜欢
    • 2022-12-15
    • 2013-09-04
    • 1970-01-01
    • 2011-04-30
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多