注意在进行封装对象的时候,在一个类中不要编写返回引用的访问器。如下代码:
package com.handkoo.test;
import java.util.Date;
public class Demo {
private Date myDate;
public Demo() {
}
public Demo(Date date){
this.myDate = date;
}
public Date getMyDate() {
return myDate;
}
public void setMyDate(Date myDate) {
this.myDate = myDate;
}
}
这样写会破坏封装性,造成很隐蔽的错误!
如果这样写:
public static void main(String[] args){
Demo demo = new Demo(new Date());
System.out.println("该对象初始化的myDate属性值为:"+demo.getMyDate());
Date date = demo.getMyDate();
double tenYears = 10*365.25*24*60*60*1000;
date.setTime(date.getTime()-(long)tenYears);
System.out.println("此时对象的myDate值为:"+demo.getMyDate());
}
结果很令人意外,两次输出的myDate属性值并不一样!
原来这是因为返回的引用导致的.
date和demo.myDate引用的是同一个对象。
所以,在返回对象的引用时,如果需要返回一个数据拷贝,最好返回一个对象的克隆。
package com.handkoo.test;
import java.util.Date;
public class Demo {
private Date myDate;
public Demo() {
}
public Demo(Date date){
this.myDate = date;
}
public Date getMyDate() {
return (Date) myDate.clone();
}
public void setMyDate(Date myDate) {
this.myDate = myDate;
}
public static void main(String[] args){
Demo demo = new Demo(new Date());
System.out.println("该对象初始化的myDate属性值为:"+demo.getMyDate());
Date date = demo.getMyDate();
double tenYears = 10*365.25*24*60*60*1000;
date.setTime(date.getTime()-(long)tenYears);
System.out.println("此时对象的myDate值为:"+demo.getMyDate());
}
}
结果: