1

我试图通过使其成为最终类来使以下类中的实例变量不可变..但似乎我可以修改它的数据..只有引用不可变吗?(即我不能将另一个 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

这里的问题具有递归性质。如果您的所有类都是不可变的,那么您对引用类型没有任何问题。但是,如果有一些类不是不可变的,并且您必须将其用作私有字段,则无法使它们不可变,afaik。

顺便提一句。使用反射,您甚至可以修改不可变类实例的状态。

于 2013-06-12T14:14:28.297 回答
0

Yes.True.当你有一个reference实例时object,它的内容instance可以改变。

于 2013-06-12T14:14:03.907 回答
0

是的。通过immutable final仅使immutable变量会受到影响(final行为不会被继承/传播到对象字段)。如果您希望在ynum设置值后保持不变,您也应该将其设为最终值。

于 2013-06-12T14:14:22.287 回答