我正在开发一个样式为:
的java源代码if (0 == var) {}
and
if (null == someObj) {}
或
if (0 != var) {}
and
if (null != someObj) {}
我应该把它重写为:
if (var == 0) {}
and
if (someObj == null) {}
提前致谢!
答案 0 :(得分:13)
完全有效:
if (0 == var) {}
and
if (null == someObj) {}
着名的名为 yoda condition ,以防止意外使用单=
代替==
。
我个人从未使用过它。但有些人喜欢它。这真的是一种品味问题。
然而,它在Java中没用。因为,这样的意外拼写错误是在编译时发现的。
以下内容将在Java中产生编译时错误。
if( var = 0 )
{
//Some code
}
因为赋值操作在Java中不产生布尔值。
但是,在C / C ++等语言中,上述内容是有效的,如果未启用警告,编译器将不会出错。上述if
条件将始终在C / C ++中求值为false(0)。因此它可能会被忽视并在运行时产生意外结果。
在GCC中,启用所有警告后,它会在C或C ++中给出上述警告:
warning: suggest parentheses around assignment used as truth value
所以这在C / C ++中也没什么用处,因为预计会编译所有警告并修复所有警告。正如我之前所说,这是个人选择而没有任何区别。
所以if ( 0 == var){}
是一个有效的语法,与if (var == 0) {}
相同,如果您更喜欢Yoda条件,那就去吧!
答案 1 :(得分:4)
一般来说,写0 == n
称为yoda condition
。因为如果你大声说出来if zero equals my var
。
最好写n == 0
。但它完全一样。但它阅读得更好。
该条件的某些优点不适用于java。
if (value = 42)
产生编译错误。 value = 42
产生int
,它不是java中if
的有效输入。但在C
中完全合法。
使用左侧的constant
进行比较是一种常见的最佳做法。但只有使用Object equals方法。
if ("CONSTANT".equals(myString))
如果myString
为空,或者您正在比较primitives
,因为对变量没有.equals()
访问权限,所以无需检查空值。
if ( "CONSTANT" == null )
虽然只是我的意见,但这种好处只是易读性。
答案 2 :(得分:0)
有些人更喜欢第一种风格,因为偶然地说var = null
而不是var == null
将是一个很难在C和C ++等语言中捕获的错误,但是null = var
会容易捕捉,因为它不会编译。如注释中所述,这不适用于Java,因为null = var
不是布尔表达式。
答案 3 :(得分:0)
此类术语称为“ Yoda表达式”,因为与英语自然语言相比,它们是“向后”。
我认为它不会带来任务 - 良好的代码审计工具可以捕获这些类型的错误,而且大多数应该已经被更严格的Java编译器捕获(使用=
而不是==
在C中是一个常见的拼写错误!)
但是,当您使用compareTo
方法时,需要考虑null
个值。
if ("example".equals(input))
无法遇到NullPointerException
,而更“自然”
if (input.equals("example"))
可以,并需要额外检查null
值。