检查空值时,我使用:
String str;
if(str == null){
//...
}
但我也见过这个:
if(null == str){
//...
}
使用其中一个是否有任何优势?或者只是为了提高可读性?
答案 0 :(得分:32)
null == x
约定通常在熟悉C的人编写的代码中找到,其中赋值也可以是表达式。一些C程序员编写这样的代码,这样如果他们错过
=
if (NULL == ptr)...
代码无法编译,因为NULL = ptr
不是有效的分配。这可以防止在代码库中引入相当狡猾的错误,尽管现代C编译器会使这些约定变得过时,只要一个人注意启用并读取生成的警告......
这种编码风格在Java中从未有过任何用处,其中引用赋值不能用作布尔表达式。它甚至可以被认为是反直觉的;在他们的自然语言中,大多数人会说“如果X为空......”,或者“如果X等于17 ......”,而不是 “如果null等于X ......”。
答案 1 :(得分:30)
第二个版本(null == str
)称为 yoda条件。
它们都会产生相同的行为,但第二个有一个优点:当您忘记一个=
时,它会阻止您意外更改变量。在这种情况下,编译器会在该行返回一个错误,并且您没有留下代码的奇怪行为以及由此产生的调试。
答案 2 :(得分:4)
除了可读性之外,两者之间没有区别。使用对你更有意义的。
答案 3 :(得分:3)
正如您所说,可读性是最重要的原因。大声读出来,(null == str)读得不好。这几乎就像从右到左阅读。 (str == null)读得更好。
此外,我认为需要考虑以下因素:
if (str != null)
if (str == null)
VS
if (null != str)
if (null == str)
我希望正(str == null)和负数以相同的方式写,这是我赞成顶集的另一个原因。
答案 4 :(得分:2)
if (null == str) {
}
是来自c / c ++的编程习惯用法,其中赋值运算符=
可用于解析为true / false语句。例如在c中,如果你想检查我是否可以用c / c ++打开一个流,你可以
if (myStream = openStream())
将打开并分配一行。但是,这意味着人们通常会在=
表示==
时输入if (x = 5)
,并且它将是c中的有效语法:例如if (x ==5)
将永远解析为true,当它们真正意味着{{ 1}}。所以人们写if (5 == x)
所以如果你遗漏了=
,你的代码将无法编译。
这不适用于java。
答案 5 :(得分:2)
没有真正的区别。然而,第二个被认为不易出错。在第一种情况下,如果您尝试
,则不会出现错误String str;
if(str = null){
}
这是你在条件句中通常不做的事情。
另外,你首先要考虑实际情况,这是一个很好的做法。
答案 6 :(得分:1)
if(a==b) {}
与if(b==a) {}
相同,如果b为null,则同样如此。就功能而言,它只是一种样式/顺序差异,至少在java中是这样。