我正在开发一个不可变的类。下面是我不可改变的课程,请告诉我这是完全不可改变的,或者如果我遗失某些东西或者它的不可分割性可以通过任何方式分解,那么请指教..
public final class ImmutableReminder{
private final Date remindingDate;
public ImmutableReminder (Date remindingDate) {
if(remindingDate.getTime() < System.currentTimeMillis()){
throw new IllegalArgumentException("Can not set reminder” +
“ for past time: " + remindingDate);
}
this.remindingDate = new Date(remindingDate.getTime());
}
public Date getRemindingDate() {
return (Date) remindingDate.clone();
}
}
答案 0 :(得分:2)
在对照类不变量进行检查之前,您应该复制一下remdingDate.getTime()。否则,引用您的remindingDate的攻击者可以在其上调用.set方法,以便在您检查其有效性后更改该值。
long time = remindingDate.getTime();
public final class ImmutableReminder{
private final Date remindingDate;
public ImmutableReminder (Date remindingDate) {
long incomingTime = remindingDate.getTime()
if(incomingTime < System.currentTimeMillis()){
throw new IllegalArgumentException("Can not set reminder” +
“ for past time: " + remindingDate);
}
this.remindingDate = new Date(incomingTime);
}
public Date getRemindingDate() {
return (Date) remindingDate.clone();
}
}
答案 1 :(得分:0)
这个类通常称为不可变的
无论如何你说“或者它的不可变性无论如何都可以分解”....在java中,反射可以打破所有规则。一些真正邪恶的人可以检测到你的私人最终提醒日期,并改变它,使其首先可访问,然后在其上调用setter。
您可以使用更好的Date实现,例如joda time DateTime,它本身是不可变的......但有人甚至可以使用反射使该字段非最终。
因此,此类 不可变,但不会牢不可破。
并且没有办法解决它。
答案 2 :(得分:-1)
如果它是完整的类,它确实是不可变的。