声纳违规:安全 - 数组直接存储
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);
}
}
[或]
public void setMonths(String[] months)
{
this.months = months.clone();
}
上述哪一项是完美的,并没有造成任何阻碍?
答案 0 :(得分:0)
clone()
就会正常工作,那么如果你的应用程序确认了将null值传递给这个方法,你应该检查一下。
if(months==null) {
this.months = null;
} else {
this.months = months.clone();
}
答案 1 :(得分:0)
在这种情况下,两种方式都很好。克隆方法不应该导致非空字符串数组的问题,因为java字符串本身是不可变的值对象。但是如果数组包含一些其他对象/集合,那么deep copy
将是更好的方法。
这将有助于您了解此声纳违规的原因。数组是可变对象,defensive copy
是处理此类方案的一种方法。您可以谷歌搜索防御性副本,深层复制,克隆方法等。看看this问题。如果是一组自定义可复制对象/集合,则需要防御性深层复制。