当前位置: 首页 > 面试题库 >

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

何高歌
2023-03-14
问题内容

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


问题答案:

对于您的特定用例,由于在循环 保留对新对象的引用,因此没有任何意义。因此,您的解决方案没有真正的替代方案。

一般来说,用Java创建短暂的对象很便宜
*(除了隐性成本之外,GC将更频繁地运行)。特别是,分配几乎是免费的,并且GC的时间主要取决于可到达对象的数量-死对象不会增加典型GC算法的GC时间。

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

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

作为一个实际示例,您可以看一下这篇文章,该文章表明在循环中创建一个新集合比在循环之前创建一个新集合并在每次迭代中清除它要便宜。

*感谢@RichardTingle提供的链接



 类似资料:
  • 问题内容: 我们都知道您由于以下原因而无法执行以下操作: 但这显然有时有效,但并非总是如此。这是一些特定的代码: 当然,这导致: 即使没有多个线程。无论如何。 解决此问题的最佳方法是什么?如何在不引发此异常的情况下循环地从集合中删除项目? 我还在这里使用任意值,不一定是an t,因此您不能依赖。 问题答案: 是安全的,您可以这样使用它: 注意,这是在迭代过程中修改集合的唯一安全方法。如果在进行迭代

  • 问题内容: 我尝试使用MVP范例构建Webapp。因为我希望API干净并且使所有内容易于测试,所以我尝试通过Contructor Injection注入所有可能的内容。现在,我到了一个具有多个文本字段的视图。当数据库中有值时,演示者将填充这些文本字段,因此我的演示者需要视图的引用,但是vie显然也需要演示者的引用。CDI告诉我,由于循环依赖性,无法将Presenter注入视图。是否有可能避免通过s

  • 问题内容: 我有两个实体: 我知道和。如果我要序列化的实例,那么它们很好。 但是我还需要传输的实例,并且我想填充该字段。 换一种说法: 在序列化时应该有,但是其父字段可能为空(可以通过使用json参考注释解决)。 在序列化时,它应该带有它们(但不必填充。) 有没有一种使用标准Jackson功能来解决它​​的方法? 即跳过已经序列化的实体的序列化,而不是标记符合或不符合序列化条件的字段。 问题答案:

  • 我有两个实体: 我知道和。如果我序列化的实例,那么它们是很好的。 但是我还需要传输的实例,并且我希望填充字段。 换句话说: null

  • 问题内容: 我知道python中的循环导入问题已经出现过很多次了,我已经阅读了这些讨论。在这些讨论中反复提出的意见是,循环导入表明设计不良,应重新组织代码以避免循环导入。 有人可以告诉我在这种情况下如何避免循环导入吗?:我有两个类,并且我希望每个类都有一个构造函数(方法),该构造函数接受另一个类的实例并返回该类的实例。 更具体地说,一类是可变的,一类是不变的。哈希,比较等需要不可变的类。可变类也需

  • 我有一个用Grails 2.3.8编写的大项目。有时,当我使用我的CI部署它时,我收到以下消息: 由于StackOverflow Error,无法完成Web应用程序[/ProjectName##1152]的注释扫描。 可能的根本原因包括 -Xss 设置过低和非法的循环继承依赖关系。正在处理的类层次结构是 [org.bouncycastle.asn1.ASN1EncodableVector- 我已经