H5W3
当前位置:H5W3 > 其他技术问题 > 正文

JAVA不可变对象 final 类型问题

看《并发编程实战》的时候P38说

当满足以下条件时,对象才是不可变的

  • 对象创建之后其状态就不可改变

  • 对象的所有域都是 final 类型

  • 对象是正确创建的(创建期间,this引用没有逸出)

感觉第一个条件已经包含了第二个条件啊?我的理解有问题吗?

回答:

final class ImmutableClass {
    private final Date date;

    public ImmutableClass(Date date) {
        this.date = date;
    }

    public Date getDate() {
        return date;
    }
}

该类是final的,成员是final的,但是成员date依旧可改变:

ImmutableClass ic = new ImmutableClass(new Date());
System.out.println(ic.getDate()); //Sun Dec 13 11:59:09 CST 2015
ic.getDate().setTime(123);
System.out.println(ic.getDate()); //Thu Jan 01 08:00:00 CST 1970
        

第一点对象创建之后其状态就不可改变可以理解为对象在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象

如果想对ImmutableClass里实现不可变对象,那只要修改getDate()方法,使其返回date的克隆。

本文地址:H5W3 » JAVA不可变对象 final 类型问题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址