我从某人那里听说null == object
比object == null
检查
例如:
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
有什么理由还是这是另一个神话? 谢谢你的帮助。
答案 0 :(得分:133)
这可能是从C学习的习惯,以避免这种拼写错误(单=
而不是双==
):
if (object = null) {
将常量放在==
左侧的约定在Java中并不实用,因为Java要求if
中的表达式求值为boolean
,所以除非常量是boolean
,否则无论以何种方式放置参数都会出现编译错误。 (如果它是一个布尔值,你不应该使用==
......)
答案 1 :(得分:31)
正如其他人所说,这是从C中学到的习惯,以避免拼写错误 - 尽管即使在C中,我也希望有足够警告级别的优秀编译器发出警告。正如Chandru所说,如果使用类型为Boolean
的变量(您不在示例代码中),以这种方式与Java中的null进行比较只会导致问题。我会说这是一种非常罕见的情况,而且不值得改变你在其他地方编写代码的方式。 (即使在这种情况下,我也不会费心扭转操作数;如果我想清楚地考虑反转它们,我相信我可以算出等号。)
没有提及是很多人(我自己肯定包括在内)发现if (variable == constant)
形式更具可读性 - 这是表达自己的一种更自然的方式。这是不盲目地从C复制约定的原因。在假设在一个环境中可能有用的东西在另一个环境中有用之前,你应该总是质疑实践(正如你在这里做的那样:)。 / p>
答案 2 :(得分:26)
除了对象类型为Boolean
之外,这在Java(1.5+)中没有多大价值。在这种情况下,这仍然可以很方便。
if (object = null)
, Boolean
将不会导致Java 1.5+中的编译失败,但会在运行时抛出NullPointerException
。
答案 3 :(得分:9)
在Java中没有充分的理由。
其他几个答案声称这是因为你可能会意外地将其分配而不是平等。但是在Java中,你必须在if中有一个布尔值,所以这个:
if (o = null)
不会编译。
这在Java中唯一重要的时间是变量是否为boolean:
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
答案 4 :(得分:6)
这也与以下内容密切相关:
if ("foo".equals(bar)) {
如果您不想处理NPE,这很方便:
if (bar!=null && bar.equals("foo")) {
答案 5 :(得分:5)
这个技巧应该可以防止v = null
类型的错别字。
但Java只允许布尔表达式作为if()
条件,因此技巧没有多大意义,编译器无论如何都会找到那些错别字。
尽管如此,它仍然是C / C ++代码的宝贵技巧。
答案 6 :(得分:3)
出于同样的原因,你在C中这样做;赋值是一个表达式,因此您将文字放在左侧,这样如果您不小心使用=
而不是==
,就无法覆盖它。
答案 7 :(得分:3)
那适合那些喜欢左侧常数的人。 在大多数情况下,在左侧使用常量将阻止抛出NullPointerException(或具有另一个nullcheck)。例如,String方法equals也是一个空检查。左边的常量将阻止你编写额外的支票。其他方式也在以后执行。左边的空值只是一致的。
像:
String b = null;
"constant".equals(b); // result to false
b.equals("constant"); // NullPointerException
b != null && b.equals("constant"); // result to false
答案 8 :(得分:2)
与以下代码比较:
String pingResult = "asd";
long s = System.nanoTime ( );
if ( null != pingResult )
{
System.out.println ( "null != pingResult" );
}
long e = System.nanoTime ( );
System.out.println ( e - s );
long s1 = System.nanoTime ( );
if ( pingResult != null )
{
System.out.println ( "pingResult != null" );
}
long e1 = System.nanoTime ( );
System.out.println ( e1 - s1 );
null != pingResult
325737
pingResult != null
47027
因此,pingResult != null
是赢家。
答案 9 :(得分:1)
由于其commutative property,object == null
和null == object
(Yoda version)之间的唯一区别是认知性:代码如何由读者阅读和消化。我不知道确切的答案,但我知道我个人更喜欢将我正在检查的对象与其他东西进行比较,而不是将其他东西与我正在检查的对象进行比较,如果是没有任何意义。从主题开始,然后将值与之比较。
在其他一些语言中,这种比较风格更有用。
为了安全地防止丢失“=”符号,我认为写null == object
是defensive programming的错误行为。围绕这个特定代码的更好方法是通过junit测试来保证行为。请记住,错过“=”的错误可能不依赖于方法的输入参数 - 您不依赖于其他人正确使用此API - 因此junit测试非常适合安全防范。无论如何,你会想要编写junit测试来验证行为;缺少“=”自然属于范围。
答案 10 :(得分:0)
用不同的方式写尤达条件
在Java
String myString = null;
if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer
尤达条件
String myString = null;
if ("foobar".equals(myString)) { /* ... */ } // will be false