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