小心使用对象引用

    技术2022-05-11  79

    在类代码的设计中, 大多数程序员喜欢把数据成员声明为私有的,并提供共有的访问和设置的方法。这也是公认的比较好的方式。类似: 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。

    最新回复(0)