pmd - PMD规则背后的 "Why"

标签 pmd java code-analysis

是否有很好的资源来描述 PMD 规则集背后的“原因”? PMD's site有“什么”——每条规则的作用——但它没有描述为什么 PMD 有这条规则,以及为什么忽略这条规则会给你在现实世界中带来麻烦。特别是,我很想知道为什么 PMD 有 AvoidInstantiatingObjectsInLoops 和 OnlyOneReturn 规则(如果您需要创建一个与集合中的每个对象对应的新对象,第一个似乎是必要的,第二个似乎在许多情况下是必要的根据某些标准返回一个值),但我真正想要的是一个链接,它描述了大多数 PMD 规则背后的“原因”,因为这种情况经常出现。

为了清楚起见,我知道我可以禁用这些以及如何做到这一点,我只是想知道为什么它们首先存在。抱歉,如果我错过了一些明显的东西,但在发布之前我做了谷歌搜索和 SO 搜索。我也明白这些问题通常是“品味”问题——我正在寻找的是规则的论据是什么以及有什么替代方案。举个具体的例子,你应该如何实现一个对象对应一个循环中的每个对象(这是Java中的常见操作)而不实例化循环中的每个对象?

最佳答案

在每种情况下,规则可以是特定情况的问题,也可以只是“品味”。

如果存在大量迭代并且实例化代价高昂,则应避免在循环中实例化对象。如果您可以将代码移出循环,您将避免许多对象实例化,从而提高性能。话虽如此,这并不总是可能的,在某些情况下,它对代码的整体性能并不重要。在这些情况下,以更清楚者为准。

对于 OnlyOneReturn,有多种方式来看待这一点(每种方式背后都有强烈的支持者),但它们基本上都归结为品味。

对于您的示例,OnlyOneReturn 支持者需要如下代码:

public int performAction(String input) {
    int result;
    if (input.equals("bob")) {
        result = 1;
    } else {
        result = 2;
    }
    return result;
}

而不是:

public int performAction(String input) {
    if (input.equals("bob")) {
        return 1;
    } else {
        return 2;
    }
}

如您所见,ReturnOnlyOnce 的额外清晰度值得商榷。

另请参阅与 instantiation within loops 相关的 SO 问题.

关于pmd - PMD规则背后的 "Why",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509856/

相关文章:

java - 保存 PMD Eclipse 插件的输出

java - TextView 中的旋转问题

java - Eclipse 系统属性

linux - 命令行全文索引?

c# - 如何处理通过 Next 属性迭代的对象?

javascript - Sonar 可以从我的 git 存储库中提取代码并定期分析吗?

gradle - 运行 Gradle 的 PMD 插件时在类路径中包含 jar

java - 如何使用checkstyle、PMD、findbugs等工具检查java类的继承级别?

java - PMD 拦截器在 Eclipse IDE 上作为插件不可见

java - DateTimeFormatter 可以解析,但不能为相同的输入格式化