我在采访中被问到这个问题。以下哪项更适合使用
MyInput.equals("Something");
或者
"Something".equals(MyInput);
由于
答案 0 :(得分:59)
我会去
"Something".equals(MyInput);
在这种情况下,如果MyInput为null
,则它不会抛出NullPointerException
我们确信equals()
将要调用的对象是NOT NULL
。
如果您希望代码中的NullPointerException
做出某些决定或抛出/包装它,那就先去吧。
没有性能影响
答案 1 :(得分:21)
成为逆势者.... :)
如果MyInput为null,第一行可能会崩溃,但是当他们不想断言'MyInput'可以为null时,这只是代码方便的程序员(通常使用C宿醉)。
如果使用第二个选项,那么这行可能不会导致NullPointerException,但可能会出现以下行。
我相信更好地了解变量的可能状态,而不是依赖一些能够减轻你良心的代码构造。
答案 2 :(得分:3)
如果NullPointerException
为MyInput
,前者会提出null
,而后者只会返回false
,因此后者在某些情况下(或可能更好)前者,如果您不希望MyInput为null并且想要快速失败)。
答案 3 :(得分:2)
那么我们如何将整个代码颠倒过来进行更改呢?
那些首先喜欢他们常数的人,当他们看到这个时他们会有什么感受?
if ( 2 == i)
在我看来,隐藏NullPointerException绝不是一个好处,而是设计中的一个缺点。
如果你从来没有想过NullPointerException但得到一个,那么你需要让你的应用程序爆炸,按照日志查看为什么会发生这种情况。这可能是你完全错过的商业案例:)
如果你可选地期望一个null参数并且不想单独处理它,那么使用像StringUtils.equals(...)这样的实用方法
那就是说,我从不允许任何团队成员使用第二种形式,因为它不一致且不可读。
答案 4 :(得分:1)
如果你想成为一个真正的聪明人,你可以指出MyInput
可能是一个特殊的String子类,它已经超越了equals
和hashcode
方法。在这种情况下,陈述的顺序非常重要。
这是一个真实的例子 - 如果你想比较其中包含数字的字符串并且你想要忽略前导零怎么样?例如,Lecture1
将等于Lecture01
。
答案 5 :(得分:-2)
我会去“某事”.equals(myInput);因为变量可以为null,所以如果变量为null,则抛出异常。
答案 6 :(得分:-4)
优秀的开发人员总是会尝试避免NullPointerException
,因此最好的答案是使用"Something".equals(myInput)
。