我和我的计算机科学教授交谈过,他建议所有的String .equals
方法都应该写成:
"Hello World".equals(fooString);
不是:
fooString.equals("Hello World");
这两种方式都可以编译通过,但我想知道第一种方式有什么好处?我之前一直使用后一种方式,这样做有问题吗?哪种方法更常见/传统?
我和我的计算机科学教授交谈过,他建议所有的String .equals
方法都应该写成:
"Hello World".equals(fooString);
不是:
fooString.equals("Hello World");
这两种方式都可以编译通过,但我想知道第一种方式有什么好处?我之前一直使用后一种方式,这样做有问题吗?哪种方法更常见/传统?
NullPointerException
,而第二种方式可能会因为fooString
为空而出现NullPointerException
的风险。null
情况,或者应该以不同的方式处理null
情况,则采用第二种方式(fooString.equals()
)有助于检测实现缺陷。如果可以将null
视为另一种情况,则第一种方法就可以使用。第一种方法确保在进行比较时不会出现NullPointerException。 当您尝试调用不存在的对象上的方法时,会抛出此异常。
稍微相关的旁注:自行查看风险
需要注意的是,在实际生产环境中,我非常非常少见到此技术或编码风格的使用。 这有两个原因。
首先,您编写的程序几乎总是希望在变量包含null的情况下执行特殊或不同的操作。 这通常表示代码功能的其他部分存在错误或需要处理的特殊情况。 因此,在对象(在这种情况下是String fooString
)上执行任何比较或方法调用之前,应始终进行null检查。
其次,fooString.equals("Hello World")
往往使您的代码略微更易读。 在正确处理您代码中的第一种技术的逻辑重要性需要几秒钟时间,而在翻阅数百或数千行代码时很容易犯判断错误。 实际上,这比听起来要复杂得多,因为在实际工作中,通常有非常大而且非常旧的程序将由以前对它们一无所知的人打补丁。 代码可读性在很大程度上有助于公司快速诊断和解决长期问题。
nvl()
等价调用会使代码更易读? - Pedanticnvl()
,但是我的公司更多地使用Teradata和DB2。 :) - asteri
null
,并在以后的某个时间得到NullPointerException。 - nhahtdh