我正在与我的 CompSci 教授交谈,他建议将所有 String.equals
方法编写为:
"Hello World".equals(fooString);
而不是:
fooString.equals("Hello World");
这两行都可以编译,但我想知道第一种方式有什么好处?我总是采用后一种方式。这是错误的吗?什么是普通/传统?
我正在与我的 CompSci 教授交谈,他建议将所有 String.equals
方法编写为:
"Hello World".equals(fooString);
而不是:
fooString.equals("Hello World");
这两行都可以编译,但我想知道第一种方式有什么好处?我总是采用后一种方式。这是错误的吗?什么是普通/传统?
第一种方法确保您在执行比较时不会收到NullPointerException。当您尝试对不存在的对象调用方法时,会抛出(发生)此异常。
下面有些相关的切线:细读自担风险
但是,请注意,我很少真正看到在合法生产环境中使用的这种技术或编码风格。有两个原因。
首先,在变量包含null的情况下,您编写的程序几乎总是想要做一些特殊的或不同的事情。这是因为它通常表示代码功能的其他部分出现错误或需要解决的特殊情况。因此,空检查应始终在对象(在本例中,您的)上进行任何比较或方法调用之前进行String fooString
。
其次,fooString.equals("Hello World")
只是倾向于使您的代码更具可读性。代码中第一种技术的逻辑意义需要几秒钟才能正确处理,并且在浏览数百或数千行代码时很容易做出判断错误。这实际上比听起来要简单得多,因为在工作世界中,通常情况下,有非常大且非常旧的程序会被那些对它们一无所知的人修补,然后再看一眼以解决问题。代码可读性在很大程度上有助于公司执行快速分类和解决长期问题的能力。
第一种方式保证
NullPointerException
永远不会被抛出,而第二种方式可能会冒风险,NullPointerException
如果fooString
碰巧是null
.然而,归根结底,这一切都归结为需求。如果要求规定这种
null
情况根本不应该发生,或者应该区别对待,那么用第二种方式 (fooString.equals()
)编写可以帮助您检测实现缺陷。如果您可以将其null
视为另一种情况,那么第一种方法就可以了。