【问题标题】:Different behaviour of Sonar for slightly two similar scenarios声纳在两个稍微相似的场景下的不同行为
【发布时间】:2013-08-23 05:53:13
【问题描述】:

考虑以下案例

public void setRules(MyRule[] rules) {
    this.rules=rules;
}

Sonar 抱怨说,

接收数组的构造函数和方法应该克隆对象和 存储副本。这可以防止用户未来的更改影响 内部功能。

这是真的,当有人在设置后更改array 的值时,我明白了这一点,该更改可能会影响内部函数。如果我们克隆该数组更改将不会生效。

现在考虑另一种情况

public void setExecutions(List<MyRule> ruleList) {
    this.ruleList= ruleList;
}

现在Sonar 没有告诉任何问题。为什么这里不需要克隆?

【问题讨论】:

标签: java sonarqube pmd


【解决方案1】:

事实上,这个 PMD 规则背后只有一个动机:原语是按值传递的,而对象是按引用传递的。数组呢?数组是 Java 中的对象,因此也是按引用传递的,但一些初级开发人员可能没有意识到这一点,并且可能认为整个数组是按值传递的。我个人认为这条规则毫无价值。

【讨论】:

  • List 和 array 都是这里的对象。你的回答无关紧要。
  • 这正是我的观点@Ruchira,两者都是对象,但此规则的目标不是禁止通过引用传递某些参数,否则让我们停止使用 Java。所以这条规则的目标似乎只是警告初级 Java 开发人员,数组(甚至是原语)是通过引用而不是值传递的。而使用 Java 集合中的类时没有任何歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多