在检查空值时,我使用这个:
String str;
if(str == null){
//...
}
但我也看到了这个:
if(null == str){
//...
}
使用其中一个有什么优势吗?还是只是为了提高可读性?
在检查空值时,我使用这个:
String str;
if(str == null){
//...
}
但我也看到了这个:
if(null == str){
//...
}
使用其中一个有什么优势吗?还是只是为了提高可读性?
第二个版本 ( null == str
) 称为尤达条件。
它们都导致相同的行为,但第二个有一个优点:它可以防止您在忘记一个变量时意外更改变量=
。在这种情况下,编译器会在该行返回错误,并且您的代码不会出现一些奇怪的行为以及由此产生的调试。
该null == x
约定通常出现在熟悉 C 的人编写的代码中,其中赋值也可以是表达式。一些 C 程序员编写这样的代码,这样如果他们错过了=
in
if (NULL == ptr)...
代码不会编译,因为NULL = ptr
它不是一个有效的赋值。这可以防止在代码库中引入相当隐蔽的错误,尽管现代 C 编译器使此类约定过时,只要注意启用和阅读生成的警告...
这种编码风格在 Java 中从来没有任何用处,在 Java 中引用赋值不能用作布尔表达式。它甚至可以被认为是违反直觉的;在他们的自然语言中,大多数人会说“如果 X 为 null...”,或者“如果 X 等于 17...”,而不是“如果 null 等于 X...”。
除了可读性之外,两者之间没有区别。使用对您更有意义的那个。
正如您所说,可读性是最重要的原因。大声读出来, (null == str) 读起来不好。这几乎就像从右到左阅读一样。(str == null) 读起来好多了。
此外,我认为需要考虑以下几点:
if (str != null)
if (str == null)
对比
if (null != str)
if (null == str)
我希望正数(str == null)和负数以相同的方式写入,这是我偏爱顶级集合的另一个原因。
if(a==b) {}
与 相同if(b==a) {}
,如果 b 为空,则相同。就功能而言,这只是样式/顺序的差异,至少在 java 中是这样。
if (null == str) {
}
是来自 c/c++ 的编程习惯,其中赋值运算符=
可用于解析真/假语句。例如在c中如果你想检查我是否可以在c/c++中打开一个流,你可以
if (myStream = openStream())
在一行中设置打开和分配。然而,这意味着人们经常=
在他们的意思是 时键入==
,这将是 c 中的有效语法:例如if (x = 5)
,当他们真正的意思时,总是会解析为 true if (x ==5)
。因此,人们会这样写if (5 == x)
,如果您遗漏 a,=
您的代码将无法编译。
这不适用于java。
没有真正的区别。然而,第二个被认为不太容易出错。在第一种情况下,如果您尝试这样做,您将不会收到错误
String str;
if(str = null){
}
这是你通常不会在条件句中做的事情。
此外,您可以先考虑实际情况,这是一个很好的做法。
一些开发人员认为这var == null
比null == var
. 他们的论点是您可能不小心分配了变量而不是进行空检查。
但只有当您测试的变量null
是 a时Boolean
,您可能会意外地使用=
而不是,==
它才会编译。
Boolean checked = Boolean.TRUE;
if(checked = null){ // accidentally assigned null and compiles
}
只有在这种情况下,赋值才能编译,因为条件表达式必须计算为布尔值。见JLS-14.9。由于赋值表达式本身的计算结果为布尔类型,因此它可以编译。但是你会得到一个NullPointerException
at runtume,因为 java 会尝试解开checked
变量null
.
如果您使用任何其他类型,那么Boolean
您将收到编译器错误。例如
String str = "hello";
if(str = null){ // compiler error, because str = null doesn't evaluate to a boolean
}
我的结论是错误情况极为罕见,您可以轻松编写检测此类错误的单元测试。
因此,以更具可读性的方式编写 if 语句。
我认为“ if name is null ”比“ if null is name ”更有意义。