有声纳违规:
声纳违规:安全 - 数组直接存储
public void setMyArray(String[] myArray) {
this.myArray = myArray;
}
Run Code Online (Sandbox Code Playgroud)
解:
public void setMyArray(String[] newMyArray) {
if(newMyArray == null) {
this.myArray = new String[0];
} else {
this.myArray = Arrays.copyOf(newMyArray, newMyArray.length);
}
}
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么?
Bri*_*new 51
它抱怨你存储的数组与调用者持有的数组相同.也就是说,如果调用者随后修改了这个数组,那么存储在对象中的数组(以及对象本身)将会改变.
解决方案是在传递对象时在对象内制作副本.这称为防御性复制.集合的后续修改不会影响存储在对象中的数组.
通常在返回集合时执行此操作(例如在相应的getMyArray()
调用中)也是一种好习惯.否则,接收器可以执行修改并影响存储的实例.
请注意,这显然适用于所有可变集合(实际上是所有可变对象) - 而不仅仅是数组.另请注意,这会产生性能影响,需要与其他问题一起进行评估.
Jor*_*sys 12
我遇到过同样的问题:
安全性 - 数组直接存储用户提供的数组 'palomitas'直接存储.
我原来的方法:
public void setCheck(boolean[] palomitas) {
this.check=palomitas;
}
Run Code Online (Sandbox Code Playgroud)
固定转向:
public void setCheck(boolean[] palomitas) {
if(palomitas == null) {
this.check = new boolean[0];
} else {
this.check = Arrays.copyOf(palomitas, palomitas.length);
}
}
Run Code Online (Sandbox Code Playgroud)
其他例子:
安全性 - 数组直接存储用户提供的数组
private String[] arrString;
public ListaJorgeAdapter(String[] stringArg) {
arrString = stringArg;
}
Run Code Online (Sandbox Code Playgroud)
固定:
public ListaJorgeAdapter(String[] stringArg) {
if(stringArg == null) {
this.arrString = new String[0];
} else {
this.arrString = Arrays.copyOf(stringArg, stringArg.length);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
50808 次 |
最近记录: |