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