Sonar的两种类似场景的不同行为

时间:2013-08-21 06:52:04

标签: java sonarqube pmd

考虑以下案例

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

Sonar抱怨并说,

  

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

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

现在考虑另一个案例

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

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

1 个答案:

答案 0 :(得分:2)

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