1

次のクラスのインスタンス変数を final 化してイミュータブルにしようとしたのですが、そのデータを変更できるようです. 参照だけがイミュータブルですか?(つまり、Y の別のインスタンスをその変数に割り当てることはできませんか?)

public class StateModification {
    private final Y immutable ;


    public StateModification() {
        super();
        this.immutable = new Y(100);
    }
    public void setImmutableData(int x){
        this.immutable.setYnum(x);
    }

    public int getImmutableData(){
        return this.immutable.getYnum();
    }


    public static void main(String[] args) {
        StateModification sm = new StateModification();

        System.out.println("immutable="+sm.getImmutableData());
        sm.setImmutableData(222);
        System.out.println("immutable="+sm.getImmutableData());
    }
}

class Y{
    private int ynum;
    public Y(int ynum) {
        super();
        this.ynum = ynum;
    }

    public int getYnum() {
        return ynum;
    }

    public void setYnum(int ynum) {
        this.ynum = ynum;
    }
}

o/p

不変=100
不変=222

4

4 に答える 4

2

これ:

private final Y immutable

参照のみが不変であることを意味します。Y のフィールドも不変でなければなりません。適切なカプセル化は、参照をファイナライズする代わりに、不変性を提供できることに注意してください。これは、可変クラスをメンバーとして採用する場合に役立ちます。

于 2013-06-12T14:14:21.573 に答える
2

ここでの問題は再帰的な性質を持っています。すべてのクラスが不変であれば、参照型に問題はありません。しかし、不変ではないクラスがいくつかあり、それをプライベートフィールドとして使用する必要がある場合、それらを不変にする方法はありません。

ところで。リフレクションを使用すると、不変クラスのインスタンスの状態も変更できます。

于 2013-06-12T14:14:28.297 に答える
0

はい.True.referenceのインスタンスに がある場合object、その内容をinstance変更できます。

于 2013-06-12T14:14:03.907 に答える
0

はい。変数immutable finalのみを作成すると、影響を受けます (動作はオブジェクト フィールドに継承/伝播されません)。値が設定された後に変更しないようにしたい場合は、それも最終的にする必要があります。immutablefinalynum

于 2013-06-12T14:14:22.287 に答える