注意不要编写返回引用可变对象的访问器方法

1 class Employee{
2     private Date hireDay;
3     //其他
4     public Date getHireDay() {
5         return hireDay;//不好的写法
6     }
7 }

执行如下代码:

Employee harry = new Employee();
        harry.setHireDay("2010-10");
        Date date = harry.getHireDay();//返回雇佣日期,类型为Date.
        System.out.println(date.getTime());
        double ten = 10*365.25*24*60*60*1000;
        date.setTime(date.getTime() - (long)ten);
        System.out.println(harry.getHireDay().getTime());//此时我们会发现harry的hireDay被改变了

也许大部分初学者都会这样写,我也一样,认为没有毛病,但是,结果不尽人意!画图可知why。 

示意图如下

所以我们不要编写返回引用可变对象的访问器方法。
解决方法:
clone();

 

public Date getHireDay() {
        return (Date)hireDay.clone();//使用clone,返回一个副本
    }

 

这样无论如何改变date也不会影响harry中的hireDay了。

posted @ 2018-11-22 11:23  llawliet0001  阅读(374)  评论(2编辑  收藏  举报