2017-04-27 221 views
5

有人推荐方法2对于null-检查,但我不确定它背后的原因是什么,为什么它应该是首选?最好的方法来检查null?

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

方法2: -

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

请参阅后的描述http://stackoverflow.com/questions/10983573/checking-for-null-what-order方法2更好的原因是,你会得到一个编译器错误,当你失踪一个“=”。 –

+4

@ReneM。但是我们在这里讨论java。即使'if(test = null)'会给编译器错误,因为这不是布尔值... – Imus

+0

@ReneM。这是一个不平等的检查,如果你忘了等号你得到'test1! null' – Jens

回答

3

Java 7中引入的java.lang.Objects漂亮的小帮手方法,如requireNonNull()。 Java 8增加了几个,特别是isNull()nonNull()。它们旨在用于stream()操作;但当然,它们并不局限于这种情况。

因此,一种替代方案将仅仅依靠这些新方法来做出这样的决定。简洁,可读“的标准,并且防止您在各处重复您自己的检查,并且零介绍和错误类型的机会当然,从另一个方法调用的最小开销。数百万次 - 无论如何它都会被打乱;然后这样的小方法可能很容易被内联

+0

当然,我本人没有答案。 – Kayaman

+1

仍然:感谢您的宝贵意见。 3天后,每次250人。我最近无法得出任何重要的答案。所以我至少要努力完善那些最初得到半正确答案的人......希望某些“更好”的问题在某些时候再次出现;-) – GhostCat

-1

这里有两个合理的理由:第一个是C的保留。在C:

if(x = NULL) { ... } 

...(注单=)是错误的一些开发商可能会不小心让。

if(NULL = x) { ... } 

...导致编译器错误。所以如果你习惯于先把null放在第一位,那么就很难犯这个错误。

然而这种逻辑并不适用于!=,所以唯一的理由继续把null首先是一致性。

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

有在把“预期”前的“实际”是常见的另一种情况,那就是:

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

因为"expected string"绝对不是null,这不能NullPointerExceptionstring == null,而string.equals("expected string")会。

所以,一些程序员养成了把预期值放在第一位的习惯。

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

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

+0

1.'if(x = null)'也是一个错误在Java中。 2. OP的变量是一个不是字符串的日期 – Jens

+0

@Jens 1.已经编辑来指出它是一种C语言习惯。 2.重点在于字符串习语导致程序员的习惯 - 而且该技术无论如何都适用于任何对象类型。 – slim

+0

2.如何运作OP的问题:'if(null!= test1){' – Jens

2

这里没有真正的区别。这两个条件将以相同的方式工作讨论从Yoda conditions最有可能来到我们写:

null   ==   temp1 
literal comparison variable 

这使我们无法作出书面=(赋值运算符)的错误,而不是==(比较)时,我们可以用代码落得像if (foo = 42)这在某些语言编译罚款造成逻辑错误可能很难找到(尤其是新手程序员)。

但在你的情况下,你不需要使用该构造。有在免得两个原因:

  1. 您使用!===,所以你会写的只是=代替!=
  2. 在Java if (expression)指望expression返回boolean值几率很低,所以即使你误写了= null这样的代码也会不能编译,因为表达式会返回null。这可以防止我们使用这种错字来运行代码。在Java中

    尤达条件才有意义boolean表情像if (stop == true),但即使是这样,而不是写if (true == stop)我们应该直接跳过== true(或==false)部分,因为我们已经有布尔值。所以我们应该写if (stop)if (!stop)

使用这样的风格使得当你在不同的语言编程意识,要通过使用一种风格,这有助于在一个语言,同时不会导致其他语言的问题(甚至是简化你的生活如果这不是真的有必要的话)。

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

相关问题