下面的Employ违反了这个原则,在getHireDay方法中返回了一个Date类对象
class Employee
{
private Date hireDay;
. . .
public Date getHireDay()
{
return hireDay; // Bad
}
. . .
}
Date类有更改器方法setTime设置毫秒,Date对象是可变的,这破坏了封装性
Employee harry = . . .;
Date d = harry.getHireDay();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;
d.setTime(d.getTime() - (long) tenYearsInMilliSeconds);
// let's give Harry ten years of added seniority
出错的原因是,d 和 harry.hireDay 引用同一个对象更改器方法就可以自动地改变这个雇员对象的私有状态!
如果需要返回一个可变对象的引用, 应该首先对它进行克隆(clone )。对象 clone 是指存放在另一个位置上的对象副本。 有关对象 clone 的详细内容将在第 6 章中讨论。下面是修改后的代码:
class Employee
{
. . .
public Date getHireDay()
{
return (Date) hireDay.clone(); // Ok
}
. . .
}
凭经验可知, 如果需要返回一个可变数据域的拷贝,就应该使用 clone。
如果使用hashCode()方法,d 和 harry.hireDay的输出一致。