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

クラスの不変条件に対してチェックする前に、reminingDate.getTime() のコピーを作成する必要があります。そうしないと、reminderingDate への参照を持つ攻撃者が .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では、リフレクションはすべてのルールを破ることができます。非常に邪悪な人物が、あなたのプライベートな最終的なremindingDateを検出して変更し、最初にアクセスできるようにしてから、セッターを呼び出す可能性があります。それ自体が不変であるjoda time DateTimeのような、より良いDate実装を使用することもできます...しかし、誰かがリフレクションを使用してフィールドを非最終にすることさえできます。
したがって、このクラス不変ですが、unbreakable ではありません
そして、それを回避する方法はありません。

于 2013-03-04T15:29:42.183 に答える
-1

それがクラス全体である場合、それは確かに不変です。

于 2013-03-04T14:54:58.693 に答える