java - PMD:避免在循环内实例化新对象

标签 java loops instantiation pmd

我遇到了 PMD 规则问题避免在循环中实例化新对象。下面是一些示例代码:

import java.awt.Dimension;

public class PMDDemo {
    public static void main(final String[] args) {
        final Dimension[] arr = new Dimension[10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new Dimension(i, i); // rule violation here
        }
    }
}

PMD 在代码中的标记位置向我提供了上述规则违规。我应该如何创建一个类的 n 个实例而不在循环中创建它们?

我知道 PMD 的一些规则是有争议的(例如 onlyOneExit 规则)。但到现在为止,我至少明白了他们背后的想法。我不明白这条规则背后的原因。有人可以帮我吗?

最佳答案

对于您的特定用例,在循环之后保持对新对象的引用是没有意义的。。因此,您的解决方案没有真正的替代方案。

更一般地说,creating short lived objects in Java is cheap *(除了 GC 将更频繁地运行的隐藏成本)。特别是分配几乎是免费的,GC 的时间主要取决于可到达对象的数量——对于典型的 GC 算法,死对象不会增加 GC 时间。

如果 JIT 检测到创建了不必要的对象,它还可以执行各种优化。

显然,不推荐创建无用对象,但尝试重用对象通常会适得其反。

作为一个实际示例,您可以查看 this post这表明在循环中创建一个新集合比在循环之前创建一个并在每次迭代时清除它更便宜。

* 感谢@RichardTingle 提供链接

关于java - PMD:避免在循环内实例化新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17340421/

相关文章:

循环内的 JavaScript 闭包——简单实用的例子

java - 如何检查对象是否已经创建?

java - 由于 "@Override"注解无法绘制图形

Java 同步和内存可见性。 10对其他线程可见吗?

java - 在 Java 的 for 循环中使用 Println 函数?

python - 使用 python 和 csv 的嵌套 For 循环

c++ - 不使用 << 的带有值的 QVector 的单行实例化

c# - 用字典实例化

java - Spring Security 自定义身份验证提供程序 403 响应

java - Spring下如何在Jetty服务器上发布CXF webservice?