我读过这篇文章:Combination of getter and list modification in Java
现在我想知道是否只有通过getter访问才能对所有类型的属性进行修改。 我尝试使用Integer对象
public class SomeClass
{
private Integer someInteger = 9;
public Integer getSomeInteger()
{
return someInteger; // id = 18, value = 9
}
}
现在我尝试在另一个类中修改someInteger:
SomeClass someClass = new SomeClass();
Integer someInteger = someClass.getSomeInteger(); // id = 18, value = 9
someInteger += 1; // id = 26, value = 10
Integer anotherInteger = someClass.getSomeInteger(); // id = 18, value = 9
使用调试器检查对象id。在我的调用类中,someInteger首先具有与getter中相同的ID。添加1之后,someInteger会获得一个新的id,并且不会编辑原始的class属性。
好的,我尝试添加一个号码失败了,但是有可能修改原来的对象吗?
我问过关于List的链接示例和我的Integer示例之间的区别。 我的想法是,
someInteger += 1;
在内部创建一个新的Integer对象。相比之下,列表有自己的修改方法,不会导致新的List对象的实例化。这是正确的吗? 从这一点可以看出,所有我可以通过getter访问的自修改方法的数据类型都必须受到其他类的修改吗?
答案 0 :(得分:1)
您的问题是您没有实现正确的setter,Integer
是不可变的。
所以当你正在递增someInteger
时你正在做的是将参考someInteger
的值增加到执行增量的方法,而不会影响私有字段。
setter方法接受一个参数,内部设置字段的值,验证后是否适用。
所以你的二传手应该是这样的:
public void setSomeInteger(int value) {
// TODO validate if applicable
someInteger = value;
}
然后你将它调用为:
someClassInstance.setSomeInteger(42);