PMD和FindBugs有什么区别?

有一个比较PMD和CheckStyle的问题 。 但是,我无法findPMD和FindBugs之间的差异/相似之处。 我相信一个关键的区别是PMD在源代码上工作,而FindBugs在编译的字节码文件上工作。 但就能力而言,它应该是一个或者是一个select,还是相互补充?

我正在使用两者。 我认为他们是相辅相成的。

正如你所说, PMD在源代码上工作,因此发现像违反命名约定,缺乏大括号,错误的空检查,长参数列表,不必要的构造函数,缺less开关中断等问题PMD也告诉你有关Cyclomatic你的代码的复杂性 ,我觉得非常有用(FindBugs没有告诉你关于Cyclomatic的复杂性)。

FindBugs在字节码上工作。 这里有一些问题FindBugs发现哪些PMD没有:equals()方法在子types上失败,clone方法可能返回null,布尔值的引用比较,不可能的转换,32位的int移位的数量不在0-31范围内,一个包含自身的集合,equals方法总是返回true,一个无限循环等等。

通常他们每个人都会发现一组不同的问题。 同时使用。 这些工具教会了我很多关于如何编写好的Java代码的知识。

PMD的最大特点是它的XPath规则 ,与规则devise器捆绑在一起,使您可以轻松地从代码示例(类似于RegEx和XPath GUI构build器)构build新的规则。 FindBugs更强大,但构build项目特定的规则和模式是非常重要的。

例如,我遇到了涉及2个嵌套for循环的性能问题,导致O(n ^ 2)运行时间,这很容易避免。 我使用PMD来构build一个即席查询 ,来查看嵌套循环的其他实例 – // ForStatement / Statement // ForStatement。 这指出了2个更多的问题。 这不是一个通用的规则。

PMD是

  • 著名
  • 在工业中广泛使用
  • 你可以在xml中添加你的规则
  • 为您提供错误级别和警告级别的详细分析
  • 您也可以扫描您的代码“复制和粘贴线”。 重复的代码。 这给了关于实现java oops的好主意。