小心使用对象引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值