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

来源:互联网 发布:网络分线器怎么用 编辑:程序博客网 时间:2024/05/16 17:24

在《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();}

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

0 0
原创粉丝点击