在类代码的设计中, 大多数程序员喜欢把数据成员声明为私有的,并提供共有的访问和设置的方法。这也是公认的比较好的方式。类似:
public class TestClone
{
private String name;
private Date date;
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
这里有个很微妙的问题,就是
public Date getDate()
{
return date;
}
这个函数,它返回的是一个指向可变对象的引用,使用不慎的话容易引发不易觉察的错误。举例如下:
public class Test
{
public static void main(String[] args) throws InterruptedException
{
// TODO Auto-generated method stub
TestClone t = new TestClone();
t.setDate(new Date());
Date date = t.getDate();
System.out.println(date);
date.setDate(20);
System.out.println(t.getDate());
}
}
程序输出:
Wed Feb 07 21:31:09 CST 2007
Tue Feb 20 21:31:09 CST 2007
分析:通过 Date date = t.getDate();,使得date和t.date指向了同一个对象。对date应用更改方法会自动改变t.date的值的。这一点需要小心使用,如果需要返回一个指向可变对象的引用,我们需要先克隆它。一个克隆是一个对象放在新位置的精确拷贝。
修改以后的代码如下:
public Date getDate()
{
return (Date) date.clone();
}
注:只要需要返回指向可变对象的引用就应该使用clone。