关于Java中编写返回可变对象引用的访问器方法

《Java核心技术》
警告:在Java中,注意不要编写返回可变对象引用的访问器方法。
例如:

class Employee {
	private Date hireDay;
	...
	public Date getHireDay() {
		return hireDay;
			// 注意,Date类有一个更改器方法setTime,Date对象是可变的,这一点破坏了封装性
	}
	...
}

注意,在接下来,如果我们创建了Employee类的对象,并且调用了它的访问器方法

Employee e = ...;
Date d = e.getHireDay();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;  // 10年的毫秒
d.setTime(d.getTime() - (long)tenYearsInMilliSeconds);

此时,d和e.hireDay引用了同一个对象,对d调用更改器方法就可以自动地改变这个Employee对象的私有状态。
如果需要返回一个可变对象的引用,首先应该对它进行克隆(对象克隆是指存放在另一个新位置上的对象副本)。
修改之后的代码:

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

你可能感兴趣的:(Java基础知识,java)