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

本文探讨了在Java中返回可变对象引用的问题,通过示例说明了直接返回对象引用可能导致外部修改内部状态,从而破坏封装性。提出了使用clone()方法返回对象副本的解决方案,确保了对象的安全性和不变性。
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了。

转载于:https://www.cnblogs.com/llawliet0001/p/9999973.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值