有一个question comparing PMD and CheckStyle。但是,我找不到PMD和FindBugs之间差异/相似性的细分。我认为一个关键的区别是PMD适用于源代码,而FindBugs适用于编译的字节码文件。但就能力而言,它应该是一种选择还是选择,还是相互补充?
答案 0 :(得分:141)
我正在使用两者。我认为它们相互补充。
如你所说,PMD适用于源代码,因此会发现以下问题:违反命名约定,缺少花括号,错误的空检查,长参数列表,不必要的构造函数,缺少交换中断等。 PMD还会告诉您代码的Cyclomatic complexity,我发现它非常有用(FindBugs没有告诉您有关Cyclomatic复杂性的信息)。
FindBugs适用于字节码。以下是FindBugs发现哪些PMD不存在的问题:equals()方法在子类型上失败,clone方法可能返回null,布尔值的引用比较,不可能的转换,32位int移位的数量不在0-31范围内,包含自身的集合,equals方法总是返回true,无限循环等等。
通常每个人都会发现一组不同的问题。使用两者。这些工具教会了我很多关于如何编写优秀Java代码的知识。
答案 1 :(得分:22)
PMD的最佳功能是 XPath规则,它与规则设计器捆绑在一起,可让您轻松地从代码示例构建新规则(类似于RegEx和XPath GUI构建器)。 FindBugs开箱即用,但构建项目特定的规则和模式非常重要。
例如,我遇到了涉及2个嵌套for循环的性能问题,导致O(n ^ 2)运行时间,这很容易避免。我使用PMD构建 ad-hoc查询,以查看嵌套for循环的其他实例 - // ForStatement / Statement // ForStatement。这指出了另外两个问题的实例。这不是一般规则。
答案 2 :(得分:3)
PMD