我读了这篇文章: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属性没有被编辑。
好吧,我尝试添加数字失败了,但是是否有可能修改原始对象?
我问我带有列表的链接示例和带有整数的示例之间的区别。 我的想法是,
someInteger += 1;
在内部创建一个新的 Integer 对象。相反,列表有自己的修改方法,这不会导致新的 List 对象的实例化。这是正确的吗? 由此可见,我可以通过 getter 访问的具有自修改方法的所有数据类型都必须受到保护,以免被其他类修改?
最佳答案
您的问题是您没有实现正确的 setter ,并且Integer
是不可变的。
因此,现在递增 someInteger
时所做的就是递增引用 someInteger
的值,该值的作用域为执行增量的方法,而不影响私有(private) field 。
setter 方法接受一个参数,并且在验证后(如果适用)在内部设置字段的值。
所以你的 setter 应该看起来像:
public void setSomeInteger(int value) {
// TODO validate if applicable
someInteger = value;
}
然后您将调用它:
someClassInstance.setSomeInteger(42);
关于java - 仅使用 getter 修改私有(private)类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27014366/