我正在研究具有以下风格的java源代码:
if (0 == var) {}
and
if (null == someObj) {}
或者
if (0 != var) {}
and
if (null != someObj) {}
我应该将其重写为:
if (var == 0) {}
and
if (someObj == null) {}
?
提前致谢!。
拥有以下内容是完全有效的:
if (0 == var) {}
and
if (null == someObj) {}
它被称为著名的yoda 条件,以防止意外使用 single=
代替==
.
我个人从未使用过它。但有些人喜欢它。这真的是一个品味问题。
但是,它在 Java 中没有用。因为,这样一个意外的错字在编译时就被发现了。
以下将在 Java 中给出编译时错误。
if( var = 0 )
{
//Some code
}
因为赋值操作在 Java 中不会产生布尔值。但是,在 C/C++ 等语言中,上述内容是有效的,如果未启用警告,编译器不会给出错误。if
在 C/C++ 中,上述条件将始终评估为假 (0)。所以它可能会被忽视并在运行时给出意想不到的结果。
在 GCC 中,启用所有警告后,它会在 C 或 C++ 中给出上述警告:
warning: suggest parentheses around assignment used as truth value
因此,这在 C/C++ 中也可能没有多大用处,因为预计编译时会包含所有警告并修复所有警告。正如我之前所说,这是个人选择,没有区别。
if ( 0 == var){}
一个有效的语法也是如此,if (var == 0) {}
如果你更喜欢 Yoda 的条件,那就去吧!
一般写0 == n
的就叫a yoda condition
。因为如果你大声说出来,你会说if zero equals my var
。
最好写n == 0
。但它是完全一样的。但是读起来更好。
该条件的某些优点不适用于 java。
if (value = 42)
产生编译错误。value = 42
产生一个在 javaint
中不是有效输入的 an 。if
但在C
.
比较使用constant
左侧的 是一种常见的最佳实践。但前提是使用 Object equals 方法。
if ("CONSTANT".equals(myString))
ifmyString
为 null 或者您正在比较primitives
,因为无法.equals()
访问该变量,因此检查 null 没有意义。
if ( "CONSTANT" == null )
虽然只是我的意见,但好处只是易读性。
这种类型的术语被称为“尤达表达式”,因为它们与英语自然语言相比是“倒退的”。
我不认为分配有什么好处——好的代码审计工具可以捕获这些类型的错误,并且大多数应该已经被更严格的 Java 编译器捕获(使用=
而不是==
C 中的常见错字!)
但是,当您使用compareTo
方法时,您需要考虑null
值。
if ("example".equals(input))
不能碰上a NullPointerException
,而更“自然”
if (input.equals("example"))
可以,并且需要额外检查null
值。
有些人更喜欢第一种风格,因为说var = null
而不是var == null
偶然会是一个错误,在 C 和 C++ 等语言中很难捕捉到,但null = var
很容易捕捉,因为它不会编译。如评论中所述,这不适用于 Java,因为null = var
它不是布尔表达式。