1

我正在开发一个不可变的类。下面是我的不可变类,请告诉我它是完全不可变的,或者如果我遗漏了某些东西,或者它的不可变性无论如何都会被打破,那么请告诉我..

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();
    }
}
4

3 回答 3

2

在根据您的类不变量检查它之前,您应该制作一份提醒日期.getTime() 的副本。否则,在您检查了它的有效性之后,引用了您的提醒日期的攻击者可能会在其上调用 .set 方法来更改该值。

长时间 = 提醒日期.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();
    }
}
于 2013-03-04T14:58:05.567 回答
0

这个类就是你通常所说的不可变的。
但是你说“或者它的不可变性无论如何都可以被打破”......在java中,反射可以打破所有规则。一些真正邪恶的人可能会检测到您的私人最终提醒日期,并对其进行更改,使其首先可访问,然后对其调用设置器。您可以使用更好的 Date 实现,例如 joda time DateTime ,它本身是不可变的......但有人甚至可以使用反射使该字段成为非最终字段。
所以这个类不可变的,但它不是牢不可破的。
而且没有办法解决它。

于 2013-03-04T15:29:42.183 回答
-1

如果它是整个类,它确实是不可变的。

于 2013-03-04T14:54:58.693 回答