我试着通过使它成为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
答案 0 :(得分:2)
此:
private final Y immutable
表示只有引用是不可变的。 Y的字段也应该是不可变的。注意,合适的封装可以提供不变性以及/而不是最终确定参考。当你采用可变类作为成员时,这将有助于你。
答案 1 :(得分:2)
这里的问题具有递归性质。如果所有类都是不可变的,则引用类型没有任何问题。但是如果有一些不是不可变的类,你必须使用那些作为私有字段,那么就没有办法让它们成为不可变的,afaik。
顺便说一句。使用反射,您甚至可以修改不可变类的实例的状态。
答案 2 :(得分:0)
是。真的。当reference
的实例object
时,instance
的内容可以更改。
答案 3 :(得分:0)
是。通过immutable
final
只会影响immutable
变量(final
行为不会继承/传播到对象字段)。如果您希望ynum
在设置值后保持不变,那么您也应该做出最终决定。