【问题标题】:What is the right position of literals in String Comparison?字符串比较中文字的正确位置是什么?
【发布时间】:2010-06-23 20:42:28
【问题描述】:

我有

if (localName.equals("TaxName")) {

但是PMD说

Position literals first in String comparisons

【问题讨论】:

  • 好吧,如果 PMD 抱怨文字在右边,我认为除了把它们放在左边(又名yoda condition 风格)之外,你别无选择:)

标签: java pmd


【解决方案1】:

"TaxName".equals(localName) 更好,如果localName 为空,则不会出现空指针异常。

【讨论】:

  • 只有在你允许的情况下才会更好。就我个人而言,我不记得在我的代码中不是我想尽快捕获的错误的情况。
  • 正则表达式替换那些:([a-zA-Z][^ ]+)\.equals\(("[^"]*")\) 替换为:\2.equals(\1)
【解决方案2】:

PMD 还应该告诉您为什么它会生成此警告。来自 PMD 网站上的the rules documentation

在字符串比较中首先定位文字 - 这样如果字符串为空,您将不会得到 NullPointerException,它只会返回 false。

【讨论】:

  • 在某些情况下,如果变量为空,代码应将其视为不等于字符串。在其他情况下,它表明存在问题,并且越快标记问题越好。在后一种情况下,variable.equals("literal") 更好,因为它会在变量为空时捕获。
【解决方案3】:

我更喜欢先定位文字,即:

if ("TaxName".equals(localName)) { ...

这样你就可以对 null 的情况进行正确的比较,而不是得到 NullPointerException。

【讨论】:

    【解决方案4】:

    就我个人而言,这对我来说没有意义。如果代码捕获到 NullPointerException,那么它就完成了您以后不必做的工作。如果 localName 最终为 null,这会导致以后出现问题,那么追踪起来会更加困难。不要更改代码以使编译器满意。如果您的代码抛出 NullPointerException,那么它可以为您节省以后的调试时间。

    【讨论】:

    • 我完全不同意并且肯定更喜欢写CONSTANT.equals(variable)而不是做初步的null检查。
    • 如果 localName 为 null 并且您稍后尝试使用它,您将获得与原始代码完全相同的效果,即 NPE。但是,更重要的是,应该总是让编译器高兴——它知道自己在做什么。我什至建议进入您选择的 IDE 的编译器设置,并将所有这些编译器警告升级为错误。
    • @CurtainDog 将编译器警告升级为错误将有效地拖延我公司一年的生产力。我相信 SO 上 90% 的人会同意。我并不是说你原则上不对,因为这些警告经常变成错误,我只是说说起来容易做起来难。
    • @PascalThivent: 如果null 是变量的合法值,应该被视为不等于字符串,那么测试文字与变量是否相等比手动测试变量更容易null 然后与字符串进行比较。但是,如果 null 不是变量的合法值,则说variable.Equals("Literal") 将有效地免费提供Assert(variable != null)
    【解决方案5】:

    为避免该警告,一个更简单的解决方案是在之前检查空指针,我们建议在我们管理的每个对象中都这样做,不仅在这种情况下:

    if (localName!=null && localName.equals("TaxName")) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2012-02-25
      • 1970-01-01
      相关资源
      最近更新 更多