【问题标题】:findbugs complains about Eclipse's auto-generated codefindbugs 抱怨 Eclipse 的自动生成代码
【发布时间】:2015-01-13 20:48:10
【问题描述】:

这是 Eclipse 为我生成的 hashCode() 方法:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (int) (id ^ (id >>> 32));
    return result;
}

当我对此运行 findbugs 时,它会抱怨最后一行:

方法 ...hashCode() 将返回结果存储在本地,然后立即返回[Scarest(2), 正常置信度]

谁在这里? Findbugs 还是 Eclipse?这很狡猾吗?

我这辈子都无法理解为什么这会让 findbugs 感到不安。代码非常清晰;在返回之前将其存储在本地不会使其更难阅读或更难维护;除非编译器写得很糟糕,否则它也不会对性能产生任何影响。

然而这被归类为最可怕!

我错过了什么吗?

(很明显,代码可以在某些方面进行简化,之所以这样,是因为就 Eclipse 而言,可能还有其他字段进入散列函数。但具体而言我在这里询问的存储值然后立即返回它的问题,因为这就是 findbugs 所抱怨的。)

【问题讨论】:

  • 我认为不必要的行确实会使代码更难阅读和维护 - FindBugs 也有同样的感觉。
  • 这篇文章与您所问的类似,并且还有一些未在此处列出的答案。 stackoverflow.com/questions/15078153/…
  • 我不禁注意到findbugs 抱怨可以通过直接返回表达式来简化代码。但它显然认为乘以一个已知为 1 的变量只是桃子 - 没有什么不简单的!我的直觉是,除了娱乐之外,不应该尝试使用自动化工具来检测由另一个自动化工具生成的代码中的样式问题。
  • Findbugs 很少对任何事情都“正确”;它只是突出显示不符合配置标准的事物。根据我的经验,FB 需要进行大量调整才能实用,以至于它变得不切实际。
  • @ajb 这不是那么先进的工具。大多数情况下,它只是一个匹配单个模式的插件。 (当然还有一些更高级的)

标签: java eclipse findbugs local-variables


【解决方案1】:

谁在这里? Findbugs 还是 Eclipse?这很狡猾吗?

晚上。代码风格主要是个人品味的问题。跨项目甚至整个世界拥有统一的代码风格很有用,但只要没有整个社区普遍采用的官方指南或规则,就没有更好或更差的风格。

有时有些规则有实际的好处。在某些情况下,Eclipse 的样式更具可读性(如果您有多个字段)。另一方面,正如@RomanC firebug 的规则所提到的那样,如果没有必要,则具有不使用变量的拟合合同的优势。

有时代码风格软件中的某些检查规则过于繁琐,但通常您可以将其关闭或降低其重要性级别。此外,我使用的 IDE 通常会在它自己生成的代码上放置代码过时警告。

注意:代码样式检查工具是可配置的。您只能启用那些可以为您、您的团队或组织降低维护代码成本的规则。

【讨论】:

  • 那么如何对其他工具自动生成的代码强制执行统一的代码样式?
  • 很难。您可以采用单一代码风格的建议工具,如 finbugs、PMD、checkstyle(使用 maven 集成等构建工具)、声纳、IDE 中内置的东西等......与您选择使用的规则集。但是,代码样式和代码生成工具之间没有无缝集成。如果您想维护代码以适应代码风格​​规则,程序员通常需要检查生成的代码。 IDE 中内置的代码检查可能会有很大帮助,并且在配置时只需单击几下快捷方式即可完成。
【解决方案2】:

代码应该被简化,因为它正在做一些你已经被 firebug 告知的不必要的事情。本次检查有效。

@Override
public int hashCode() {
    return 31 + (int) (id ^ (id >>> 32));
}

【讨论】:

  • “不必要”的东西根本不会影响性能。对此,任何人真正能说的都是基于意见的。
  • 我已经在问题中澄清说,这是存储一个值然后立即返回它的问题,因为这就是 findbugs 所抱怨的。我同意其余部分可以写得更简单。
  • “最恐怖”的类别也是正确的类别吗?这里有潜在的错误吗?什么毛病?因为就像OP一样,我不明白。
  • 局部变量需要堆栈来存储它的值,你可以不使用它们,你也可以使用字节码计算操作并比较两个实现。没有性能瓶颈,但有一点开销。
  • 具有良好优化能力的编译器应该能够发现在这种情况下可以消除存储到堆栈上的局部变量的操作。
【解决方案3】:

Eclipse 代码并没有那么糟糕,但它不必要地笨拙。在这种微不足道的情况下,手写通常会更好。您的代码基本上等同于:

@Override public int hashCode() {
    return Long.hashCode(id);
}

【讨论】:

  • 这没有回答问题。
  • @whiskeyspider 我认为确实如此 - findbugs 指出代码很笨拙而且它是......
【解决方案4】:

这不是关于简化,而是更多关于你忘记某些东西的可能性。如果你存储结果,那很可能是因为你想用它做点什么。如果没有,你就退货吧。

FindBugs 警告您,您很可能打算使用存储的值做某事,但很可能忘记了。

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (int) (id ^ (id >>> 32));

    // I meant to do something more here with result, but forgot...

    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 2011-04-07
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多