当你创建一个类,用来表示用户信息(用户信息只允许查看,不允许修改)的时候,你会怎么做呢?
class Employee
{
private Date hireDay;
pulic Date getHireDay()
{
return hireDay;
}
//其他属性省略
//....
}
上面的代码感觉 有问题吗?
然后你想一下一个问题,没有对hireDay设置set方法,hireDay可以修改吗?
Employee employee = new Employee();
Date d = employee.getHireDay();
d.setTime(d.getTime()-1);
//...
发现d.setTime(d.getTime()-1);
之后employee的hireDay的值被修改了!!!
那么问题来了,为什么呢?
出错的原因很微妙,d和employee.hireDay引用的是同一个对象,因此对d调用更改器的方法就可以自动改变这个雇员对象的私有状态。
解决方案:
如果需要返回一个可变对象的引用的时候,应首先对它进行克隆(clone)。对象clone是指存放在另一个位置的对象副本。
修改后的代码:
class Employee
{
private Date hireDay;
pulic Date getHireDay()
{
return hireDay.clone();
}
//其他属性省略
//....
}
问题解决!!!