【发布时间】:2010-06-23 20:42:28
【问题描述】:
我有
if (localName.equals("TaxName")) {
但是PMD说
Position literals first in String comparisons
【问题讨论】:
-
好吧,如果 PMD 抱怨文字在右边,我认为除了把它们放在左边(又名yoda condition 风格)之外,你别无选择:)
我有
if (localName.equals("TaxName")) {
但是PMD说
Position literals first in String comparisons
【问题讨论】:
"TaxName".equals(localName) 更好,如果localName 为空,则不会出现空指针异常。
【讨论】:
([a-zA-Z][^ ]+)\.equals\(("[^"]*")\) 替换为:\2.equals(\1)
PMD 还应该告诉您为什么它会生成此警告。来自 PMD 网站上的the rules documentation:
在字符串比较中首先定位文字 - 这样如果字符串为空,您将不会得到 NullPointerException,它只会返回 false。
【讨论】:
variable.equals("literal") 更好,因为它会在变量为空时捕获。
我更喜欢先定位文字,即:
if ("TaxName".equals(localName)) { ...
这样你就可以对 null 的情况进行正确的比较,而不是得到 NullPointerException。
【讨论】:
就我个人而言,这对我来说没有意义。如果代码捕获到 NullPointerException,那么它就完成了您以后不必做的工作。如果 localName 最终为 null,这会导致以后出现问题,那么追踪起来会更加困难。不要更改代码以使编译器满意。如果您的代码抛出 NullPointerException,那么它可以为您节省以后的调试时间。
【讨论】:
CONSTANT.equals(variable)而不是做初步的null检查。
null 是变量的合法值,应该被视为不等于字符串,那么测试文字与变量是否相等比手动测试变量更容易null 然后与字符串进行比较。但是,如果 null 不是变量的合法值,则说variable.Equals("Literal") 将有效地免费提供Assert(variable != null)。
为避免该警告,一个更简单的解决方案是在之前检查空指针,我们建议在我们管理的每个对象中都这样做,不仅在这种情况下:
if (localName!=null && localName.equals("TaxName")) {
...
}
【讨论】: