使用IDE的findbugs找到这么一个bug:May expose internal representation by incorporating reference to mutable object
抛出潜藏bug的代码
public class AlertCreateTaskRuleDTO extends BaseDTO {
public String[] getAlertNameArray(){return this.alertNameArray;}
public void setAlertNameArray(String[] names){this.alertNameArray = names;}
}
public class AlertCreateTaskRuleDTO extends BaseDTO {
public String[] getAlertNameArray(){return this.alertNameArray.clone();}
public void setAlertNameArray(String[] names){this.alertNameArray = names.clone();}
}
测试
public class test { public static void main(String []args){ AlertCreateTaskRuleDTO b = new AlertCreateTaskRuleDTO(); String[] values ={"11","22","333"}; b.setAlertNameArray(values); values[0]="GAI"; System.out.print(b.getAlertNameArray()[0]); } }
输出结果为GAI
原因:setter赋值是设置的数组的引用,一旦数组发生改变引用这个数组的地方都会改变
getter获取的是数组的引用,自然获得的是数组更改后的值。
防止这种问题的方法是:设置、获得一个数组的拷贝,而不直接设置或者获得一个数组引用
修改后:
public class AlertCreateTaskRuleDTO extends BaseDTO {
public String[] getAlertNameArray(){return this.alertNameArray.clone();}
public void setAlertNameArray(String[] names){this.alertNameArray = names.clone();}
}
测试输出的结果为11