仅使用getter修改私有类属性

时间:2014-11-19 10:22:03

标签: java getter

我读过这篇文章: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访问的自修改方法的数据类型都必须受到其他类的修改吗?

1 个答案:

答案 0 :(得分:1)

您的问题是您没有实现正确的setter,Integer是不可变的。

所以当你正在递增someInteger时你正在做的是将参考someInteger的值增加到执行增量的方法,而不会影响私有字段。

setter方法接受一个参数,内部设置字段的值,验证后是否适用。

所以你的二传手应该是这样的:

public void setSomeInteger(int value) {
    // TODO validate if applicable
    someInteger = value;
}

然后你将它调用为:

someClassInstance.setSomeInteger(42);