【问题标题】:Sonar Issue - Array is directly stored声纳问题 - 阵列直接存储
【发布时间】:2015-04-02 22:41:37
【问题描述】:

我有一个方法,其中我直接将方法参数分配给类变量。

public void sample(String[] targets)
{
    this.objects = Targets;
}

我发现的一个解决方案是使用 Arrays.copy(targets) 创建数组的新副本。但我担心这是否会影响系统的性能。

我有两个问题:

首先,如果我使用 Arrays.copy(),影响有多大。

如果影响很大(如果阵列长度很高),那么是否有任何其他解决方案可以在不影响性能的情况下解决此声纳问题。

【问题讨论】:

  • 您必须衡量对应用程序的性能影响,并确定您是否可以接受。如果您不能接受复制数组的冲击,您可能还有其他问题,但您唯一的其他解决方案是确保没有其他任何东西能够修改数组元素,从而无需复制它们。
  • 您可以考虑使用 System.arrayCopy(..) 以获得更好的性能。
  • 除非您的应用程序在大规模运行,否则您不会注意到性能差异,尤其是在数组不是很大的情况下。顺便说一句,您根本不需要 Arrays.copy;所有数组都有一个不引发异常的隐式公共clone() 方法。 this.objects = targets.clone(); 就足够了。

标签: java arrays sonarqube


【解决方案1】:

Sonar 提示建议您为给定数组创建一个defensive copy。一般来说,您应该遵循该建议,否则您的代码可能会产生错误,这些错误是由不需要的side-effects 引起的,因此难以本地化。

通常,防御性复制对性能的影响可以忽略不计,因为它的开销并不明显。对于支持/反对防御性副本的决策而言,更重要的是它对代码质量的其他方面的影响,例如可读性、可用性和稳定性。

只要不经常调用sample(),您就无需犹豫复制数组。

【讨论】:

  • 即使防御性复制对性能的影响可以忽略不计,您是否觉得使用 final 方法参数比复制更好?
  • 这是一个常见的误解。 final 方法参数不提供任何安全性,因为客户端仍然可以修改引用的对象。
猜你喜欢
  • 2012-07-19
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多