【问题标题】:Modification of a private class attribute only with getter仅使用 getter 修改私有类属性
【发布时间】:2014-11-19 10:22:02
【问题描述】:

我看了这篇文章:Combination of getter and list modification in Java

现在我想知道是否只能通过 getter 访问来修改所有类型的类属性。 我尝试了一个整数对象

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 对象。相比之下,列表有自己的修改方法,不会导致新列表对象的实例化。这是正确的吗? 由此可以得出结论,我可以通过 getter 访问的所有具有自我修改方法的数据类型都必须受到保护,以免被其他类修改?

【问题讨论】:

  • stackoverflow.com/questions/40480/… 应该会回答您的问题。您本地的Integer someInteger 与课堂上的引用不同。修改你的不会触及另一个。由于Integer 是不可变的,您将通过执行“+1”创建一个新对象(由于自动装箱/拆箱,应该相当于someInteger = Integer.valueOf(someInteger.intValue() + 1)

标签: java getter


【解决方案1】:

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

因此,当您现在递增 someInteger 时,您正在做的是将引用 someInteger 的值递增到您正在执行递增的方法,而不会影响私有字段。

setter 方法接受一个参数,并且在内部 设置字段的值,如果适用的话,在验证之后。

所以你的 setter 应该是这样的:

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

然后你会调用它:

someClassInstance.setSomeInteger(42);

【讨论】:

  • 感谢您的快速答复。请阅读链接的文章。我害怕只用 getter 修改类属性。
  • @Karina 如果您的 getter 返回可变对象(例如 List),则可以通过调用 getter 来修改它。这对于Integer 是不可能的。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多