有违反声纳的行为:

违反声纳:安全-阵列直接存储

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()调用中)。否则,接收者可能会执行修改并影响存储的实例。

注意,这显然适用于所有可变集合(实际上是所有可变对象),而不仅仅是数组。还要注意,这会对性能产生影响,需要与其他问题一起进行评估。

09-10 08:29