Java中不编写返回引用对象的访问器方法

在《Java核心技术 卷1》(原书第9版)的时候,在113也有一个警告,说注意不要编写返回引用可变对象的访问器方法,关于可变对象的概念,我自己的理解就是在类中可以不通过域更改器方法就能改变值的对象。,而在所给示例的 Employee 类中就违反了这个设计原则,其中的 geiHireDay 方法就返回了一个 Date 类对象,因为这会破坏封装性!

代码如下:

import java.util.*;

public class EmployeeTest {
    public static void main(String[] args){
        Employee temp = new Employee();
        System.out.println(temp.getHireDay());  //先打印当前返回结果

        Date d = temp.getHireDay();
        double tenYears = 10 * 365.25 * 24 * 60 * 60 * 1000;
        d.setTime(d.getTime() - (long)tenYears);

        System.out.println(temp.getHireDay());  //再次打印返回结果

    }// main
}

class Employee{

    private Date hireDay;

    public Employee(){
        GregorianCalendar gre = new GregorianCalendar();
        hireDay = gre.getTime();
    }

    public Date getHireDay(){
        return hireDay;
    }

}

这是返回的结果:

这里写图片描述

可以看到,temp.hireDay属性已经被修改了,那么原因是什么呢?其实原因很微妙。因为 d 和 temp.hireDay 引用同一个对象。对 d 调用更改器方法可以自动地改变 temp 的私有状态。

这里写图片描述

如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象 clone 是指存放在另一个位置上的对象副本。修改后的代码如下:

public Date getHireDay(){
   return (Date) hireDay.clone();
}

结果如下:这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值