Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的不可变实例变量_Java_Immutability - Fatal编程技术网

java中的不可变实例变量

java中的不可变实例变量,java,immutability,Java,Immutability,我试图通过使下面的类中的实例变量为final使其不可变。但似乎我可以修改它的数据。。只有引用是不可变的吗?也就是说,我不能将Y的另一个实例赋给该变量 public class StateModification { private final Y immutable ; public StateModification() { super(); this.immutable = new Y(100); } public void

我试图通过使下面的类中的实例变量为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 immutable=222

Yes.True。当引用对象的实例时,可以更改该实例的内容。

Yes.True。当引用对象的实例时,可以更改该实例的内容。

private final Y immutable
表示只有引用是不可变的。Y的字段也应该是不可变的。注意,适当的封装可以提供不变性和/而不是最终确定引用。当您采用可变类作为成员时,这将对您有所帮助。

这:

private final Y immutable

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

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

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

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


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

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


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

只是引用不可变吗?=>是的,就是它。@assylias你应该把它作为一个答案,即使它很短。final与不变性几乎没有任何关系。@BrianRoach这也许是一个有点太强的说法了@BrianRoach确实如此,否则它实际上是不可变的,这与内存模型的观点不同,我这里指的是字段是最终的,而不是类本身,这更像是一个安全问题。只有引用是不可变的吗?=>是的,就是它。@assylias你应该把它作为一个答案,即使它很短。final与不变性几乎没有任何关系。@BrianRoach这也许是一个有点太强的说法了@BrianRoach确实如此,否则它实际上是不可变的,这与内存模型的观点不同,我这里指的是字段是最终的,而不是类本身,这更像是一个安全问题。这没有真正意义。你回答是的,这是正确的,但是你说实例的内容不能被改变,这是错误的。Y类是实例,内容可以更改。哦..谢谢你的spot dudes。编辑:这真的没有意义。你回答是的,这是正确的,但是你说实例的内容不能被改变,这是错误的。Y类是实例,内容可以更改。哦..感谢spot dudes。编辑: