当前位置: 代码迷 >> J2SE >> JAVA一个事例没看懂
  详细解决方案

JAVA一个事例没看懂

热度:56   发布时间:2016-04-23 20:21:56.0
JAVA一个例子没看懂
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完全就是一个东西, 同一个引用, 指向同一个内存对象

------解决方案--------------------
引用:
Quote: 引用:

如果你直接返回hireDay,那么其他人就可以通过引用,你的意思就是,如果返回了hireDay,那么这个返回的hireDay前面本来加上的private修饰就白加了是吗?private hireDay外部不能修改,但是把它返回出来了在外面就可以更改hireDay的值了?

private 外不是hi不能修改,但是你的get方法把引用泄露了,所以外部可以通过get方法得到hireDay引用,还是可以修改,所以很多时候都是返回clone对象来放在被修改的
------解决方案--------------------
这样做的目的也是为了线性安全着相。
  相关解决方案