AVA核心编程卷1第九版里面的一个例子:书上说-->注意不要编写返回引用可变对象的访问器方法。这句话没看懂。返回可变对象的引用是什么意思呀?下面是代码:
Employee harry...;
Date d = harry.getHireDay();
double tenYearsInMilliSeconds = 10*365.25*24*60*60*1000;
d.setTime(d.getTime()-(long)tenYearsInMillisSeconds);
书上说d和harry.hireDay引用同一个对象,对d调用更改器方法就可以自动改变这个雇员对象的私有状态,会破坏封装性。这句话又是什么意思呀?d和harry.hireDay都引用了哪个一样的对象呀?是怎么破坏封装性的呢?
后面又说如果要返回一个可变对象的引用,应该先对他进行克隆(clone),比如:
源代码:
class Employee
{
...
public Date getHireDay()
{
return hireDay;
}
...
}
应该改为:
class Employee
{
...
public Date getHireDay()
{
return hireDay.clone();
}
...
}
有劳各位大神解答一下,新人不胜感激!
------解决方案--------------------
如果你直接返回hireDay,那么其他人就可以通过引用修改这个hireDay,而你要是返回克隆对象的话,别人没办法对原始的hireDay进行修改
------解决方案--------------------
书上这句话意思不贴切: "d和harry.hireDay引用同一个对象", 实际上d 与 harry.hireDay完全就是一个东西, 同一个引用, 指向同一个内存对象
------解决方案--------------------