这是关于我创建的不可变类。 它如下:
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中的日期对象被更改,即使对象相同,也没有创建新对象。
这违反了不可变类的定义。 请问我的方法是否错误,或者我错过了关于不变性概念的事情?
问候!!
答案 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);
}
}