下面的Employ違反了這個原則庄吼,在getHireDay方法中返回了一個Date類對象
class Employee
{
private Date hireDay;
. . .
public Date getHireDay()
{
return hireDay; // Bad
}
. . .
}
Date類有更改器方法setTime設(shè)置毫秒吹艇,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 引用同一個對象更改器方法就可以自動地改變這個雇員對象的私有狀態(tài)洒忧!
如果需要返回一個可變對象的引用蝴韭, 應(yīng)該首先對它進(jìn)行克隆(clone )熙侍。對象 clone 是指存放在另一個位置上的對象副本榄鉴。 有關(guān)對象 clone 的詳細(xì)內(nèi)容將在第 6 章中討論。下面是修改后的代碼:
class Employee
{
. . .
public Date getHireDay()
{
return (Date) hireDay.clone(); // Ok
}
. . .
}
憑經(jīng)驗可知蛉抓, 如果需要返回一個可變數(shù)據(jù)域的拷貝庆尘,就應(yīng)該使用 clone。
如果使用hashCode()方法芝雪,d 和 harry.hireDay的輸出一致。