两者有什么区别?哪一个更好?我在面试中被问过这个问题。
我能想到的唯一区别是,如果您想if(null == object)
而忘记添加==
并添加=
,则不会对您的计划产生任何副作用。但如果你在做if(object = null)
时犯了这个错误,那么你的程序就是吐司。
答案 0 :(得分:1)
添加到Nayuki's answer,如果程序员错误输入= for ==,就像if(object = null)那样,仍然很少会出现编译错误,并且代码中会出现错误。
例如:if (boolean1 = boolean2)
,首先是赋值表达式,然后针对if条件求值。另一个有问题的代码是if (wrapperBool = null)
,其中wrapperBool是一个布尔包装类变量。它将在运行时抛出NullPointerException(NPE)。
但是作为Benny mentioned,应该在单元测试用例中预先记录错误输入。
答案 1 :(得分:0)
在Java编程语言中,if (object == null)
与if (null == object)
这两个表达式完全相同,因为==
运算符是可交换的。当用英语说话时,前一种符号被认为更自然,而后一种符号有一些支持者。
如果程序员为=
错误键入==
,如if (object = null)
,则这是Java中的编译时错误,因为条件表达式必须是boolean
值,而不是Object
。因此,if (object == null)
和if (null == object)
同样可以抵御Java中的错误 。
但是在C和C ++中,整数,浮点和指针类型在条件表达式中被隐式强制转换为bool
。编写if (object = null)
将编译但做错了,而编写if (null = object)
应该会触发编译时错误。
另请参阅:https://coderanch.com/t/489740/java/difference-null-object-object-null
答案 2 :(得分:0)
由于其commutative property,object == null
和null == object
(Yoda version)之间的唯一区别是认知性:代码如何由读者阅读和消化。我不知道确切的答案,但我知道我个人更喜欢将我检查的对象与其他东西进行比较,而不是将其他东西与我检查的对象进行比较< / em>,如果这是有道理的。从主题开始,然后将值与之比较。
在其他一些语言中,这种比较风格更有用。
为了安全防范失踪&#34; =&#34;但是,我认为写null == object
是defensive programming的错误行为。围绕这个特定代码的更好方法是通过junit测试来保证行为。请记住,错过&#34; =&#34;不依赖于方法的输入参数 - 您不依赖于其他人正确使用此API - 因此junit测试非常适合安全防范。无论如何,你会想要编写junit测试来验证行为;缺少&#34; =&#34;自然属于范围。
或许,这可能是一个棘手的问题,让你谈论讨论uses of Optional的主题,以避免原始的空检查?