有一个关于PMD和CheckStyle的比较问题。然而,我找不到一份详细说明PMD和FindBugs之间差异/相似性的好资料。我认为一个主要区别是,PMD适用于源代码,而FindBugs适用于编译后的字节码文件。但就功能而言,它们应该是二选一还是互补的?
有一个关于PMD和CheckStyle的比较问题。然而,我找不到一份详细说明PMD和FindBugs之间差异/相似性的好资料。我认为一个主要区别是,PMD适用于源代码,而FindBugs适用于编译后的字节码文件。但就功能而言,它们应该是二选一还是互补的?
我同时使用这两个工具,我认为它们相辅相成。
正如你所说,PMD 作用于源代码,因此会发现以下问题:命名规范的违反、大括号缺失、空指针检查不当、参数列表过长、不必要的构造函数、switch语句中缺少break等。PMD还会告诉你代码的圈复杂度,我觉得这非常有帮助(FindBugs没有圈复杂度的信息)。
FindBugs 作用于字节码。下面是FindBugs能够发现而PMD不能的一些问题:equals() 方法对子类型无效、克隆方法可能返回null、Boolean值的引用比较、无法转换、32位整数位移量超出0-31的范围、包含自身的集合、equals方法总是返回true、无限循环等。
通常每个工具会发现不同的问题。建议同时使用这两个工具,它们教会了我如何编写良好的Java代码。
PMD最好的特点是其XPath规则,配备了规则设计器,让您可以轻松地从代码样本中构建新规则(类似于RegEx和XPath图形界面构建器)。
FindBugs在开箱即用方面更强大,但构建项目特定规则和模式非常重要。
例如,我遇到了一个涉及2个嵌套for循环的性能问题,导致运行时间为O(n^2),这很容易避免。我使用PMD构建了一个临时查询,以查看其他嵌套for循环实例 - //ForStatement/Statement//ForStatement。这指出了另外两个问题实例。这绝非通用规则。
PMD是一个广泛应用于IT技术行业的著名工具。