用户定义的不可变类会产生意外结果

时间:2014-12-10 05:12:11

标签: java immutability

这是关于我创建的不可变类。 它如下:

final class ImmutableClass
{
  private final Date d;

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

  public Date getD()
  {
    return this.d;
  }

}

当我在下面的类中使用上面的类时:

public class UserClass
{
  public static void main(String args[])
  {
    Date d1 = new Date();
    ImmutableClass im= new ImmutableClass(d1);
    System.out.print("Date is : " + im.getD() + ", object is " + im);//printing originals

    //trying to change the date
    d1.setMonths("10");
    System.out.print("New Date is : " + im.getD() + ",New object is " + im);//printing  latter ones
  }
}

结果如下:

Date is : Wed Dec 10 10:38:43 IST 2014, object is com.fedex.hrt.hrmailbox.ImmutableClass@19616c7

New Date is : Mon Feb 10 10:38:43 IST 2014,New object is com.fedex.hrt.hrmailbox.ImmutableClass@19616c7

ImmutableClass中的日期对象被更改,即使对象相同,也没有创建新对象。

这违反了不可变类的定义。 请问我的方法是否错误,或者我错过了关于不变性概念的事情?

问候!!

1 个答案:

答案 0 :(得分:0)

调用者仍然可以引用Date(并且可以修改其引用)。如果你在构造函数中clone()它,你可以阻止它。像,

public ImmutableClass(Date d)
{
  this.d = (Date) d.clone();
}

此外,来电者可以修改您在Date中返回的getD,因此您也应该克隆();

public Date getD()
{
  return this.d != null ? (Date) this.d.clone() : null;
}

或者,对于Date,存储它包装的毫秒数

final class ImmutableClass {
    private final long d;

    public ImmutableClass(Date d) {
        this.d = (d != null) ? d.getTime() : 0;
    }

    public Date getD() {
        return new Date(d);
    }
}