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