存在声纳违规:
声纳违规:安全性 - 数组直接存储
public void setMyArray(String[] myArray) {
this.myArray = myArray;
}
解决方案:
public void setMyArray(String[] newMyArray) {
if(newMyArray == null) {
this.myArray = new String[0];
} else {
this.myArray = Arrays.copyOf(newMyArray, newMyArray.length);
}
}
但我想知道为什么?
它抱怨您存储的数组与调用者保存的数组相同。也就是说,如果调用者随后修改此数组,则存储在对象中的数组(以及对象本身)将发生更改。
解决方案是在对象传递时在对象内创建一个副本。这就是所谓的防御性复制。对集合的后续修改不会影响存储在对象内的数组。
通常在返回集合时执行此操作也是一种很好的做法(例如,在相应的getMyArray()
称呼)。否则接收者可能会执行修改并影响存储的实例。
请注意,这显然适用于所有可变集合(实际上是所有可变对象)——而不仅仅是数组。另请注意,这会对性能产生影响,需要与其他问题一起进行评估。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)