注意:不要编写返回引用可变对象的访问器方法。在Employee类中就违反了这个设计原则,其中的getHireDay方法返回了一个Date类的对象:
class Employee{
private Date hireDay;
public Date getHireDay(){
return hireDay; //Bad
}
}
LocalDate类没有更改器方法,与之不同,Date类有个更改器方法setTime,可以设置毫秒数。
Date对象是可变的,这一点就破坏了封装性!(因为封装性只能用自己的setXXX更改器修改)如下面代码:
Employee harry = ...;
Date d = harry.getHireDay();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;
d.setTime(d.getTime() - (long)tenYearsInMilliSeconds);
d和harry.hireDay引用同一个对象,对d调用更改器方法就可以自动地改变这个雇员对象的私有状态!
如果需要反回一个可变对象的引用,应该首先对它进行克隆。对象clone是指存放在另一个位置上的对象副本。下面是修改后的代码:
class Employee{
private Date hireDay;
public Date getHireDay(){
return (Date)hireDay.clone(); //OK
}
}