java中的不可变实例变量

时间:2013-06-12 14:10:17

标签: java immutability

我试着通过使它成为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 个答案:

答案 0 :(得分:2)

此:

private final Y immutable

表示只有引用是不可变的。 Y的字段也应该是不可变的。注意,合适的封装可以提供不变性以及/而不是最终确定参考。当你采用可变类作为成员时,这将有助于你。

答案 1 :(得分:2)

这里的问题具有递归性质。如果所有类都是不可变的,则引用类型没有任何问题。但是如果有一些不是不可变的类,你必须使用那些作为私有字段,那么就没有办法让它们成为不可变的,afaik。

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

答案 2 :(得分:0)

是。真的。当reference的实例object时,instance的内容可以更改。

答案 3 :(得分:0)

是。通过immutable final只会影响immutable变量(final行为不会继承/传播到对象字段)。如果您希望ynum在设置值后保持不变,那么您也应该做出最终决定。

相关问题