在Java中,如何正确地使用.equals方法?

14

我和我的计算机科学教授交谈过,他建议所有的String .equals方法都应该写成:

"Hello World".equals(fooString);

不是:

fooString.equals("Hello World");

这两种方式都可以编译通过,但我想知道第一种方式有什么好处?我之前一直使用后一种方式,这样做有问题吗?哪种方法更常见/传统?

2个回答

18
第一种方式保证不会出现NullPointerException,而第二种方式可能会因为fooString为空而出现NullPointerException的风险。
然而,最终,一切都归结于需求。如果需求规定根本不应该出现null情况,或者应该以不同的方式处理null情况,则采用第二种方式(fooString.equals())有助于检测实现缺陷。如果可以将null视为另一种情况,则第一种方法就可以使用。

没有所谓的随机NullPointerException。只有在此规范定义的一个或多个情况发生时才会抛出此异常(这里没有任何随机性)。我想知道这是如何得到14个赞的。http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html - aviad
@aviad:我承认在这里使用"random"不是一个很好的选择。我的意思是在解除引用之前忘记检查null,并在以后的某个时间得到NullPointerException。 - nhahtdh

13

第一种方法确保在进行比较时不会出现NullPointerException。 当您尝试调用不存在的对象上的方法时,会抛出此异常。

稍微相关的旁注:自行查看风险

需要注意的是,在实际生产环境中,我非常非常少见到此技术或编码风格的使用。 这有两个原因。

首先,您编写的程序几乎总是希望在变量包含null的情况下执行特殊或不同的操作。 这通常表示代码功能的其他部分存在错误或需要处理的特殊情况。 因此,在对象(在这种情况下是String fooString)上执行任何比较或方法调用之前,应始终进行null检查。

其次,fooString.equals("Hello World")往往使您的代码略微更易读。 在正确处理您代码中的第一种技术的逻辑重要性需要几秒钟时间,而在翻阅数百或数千行代码时很容易犯判断错误。 实际上,这比听起来要复杂得多,因为在实际工作中,通常有非常大而且非常旧的程序将由以前对它们一无所知的人打补丁。 代码可读性在很大程度上有助于公司快速诊断和解决长期问题。


1
长话短说:首先,这是典型的计算机科学学者过分强调形式而忽视功能的思维方式,他们从未在生产代码中写过一行代码 :) - Philipp
因为大量的 nvl() 等价调用会使代码更易读? - Pedantic
我在生产代码中很少看到nvl(),但是我的公司更多地使用Teradata和DB2。 :) - asteri
我的评论是针对Philipp的,但我们的Oracle数据库人员喜欢使用nvl函数。这让我很不舒服。 - Pedantic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接