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

我有PMD规则的问题Avoid instantiating new objects inside loops 。 这是一些示例代码:

 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规则)。 但到目前为止,我至少理解他们背后的想法。 我不明白这条规则背后的原因。 有人可以帮助我吗?

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

更一般地说, 在Java中创建短期对象是便宜的 *(除了GC将更频繁地运行的隐藏成本)。 特别是,分配几乎是免费的,GC的时间主要取决于可达对象的数量 – 死对象不会增加典型GC算法的GC时间。

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

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

作为一个实际的例子,你可以看看这篇文章 ,它表明在循环中创建一个新集比在循环之前创建一个并在每次迭代中清除它更便宜。

*感谢@RichardTingle提供的链接

 for (int i = 0; i < arr.length; i++) { arr[i] = new Dimension(i, i); // rule violation here } 

Above Pmd可以解决

  for (int i = 0; i < arr.length; i++) { arr[i] = createNewDimension(i,i); // rule violation here } private static Dimension createNewDimension(i,i) { return new Dimension(i, i); } 

我们不应该在循环中直接使用new运算符,只需在私有方法中移动它。