为什么我可以在Java中使用getter设置私有类属性的值?

ere*_*007 -1 java encapsulation class

我是Java的新手,我想知道为什么可以这样设置私有属性的值,而不使用setter?:

class Example {
   private int[] thing;
   public void initialize() {
       thing = new int[10];
   }
   public int[] getThing() { 
       return thing;
   }
}
class myclass {
   public static void main(String args[]) {
       Example e = new Example();
       e.initialize();
       e.getThing()[0] = 1;
       System.out.println(e.getThing()[0]) // value is still 1...
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么这是合法的......

编辑:我希望e.getThing()返回thing的值而不是对thing的引用,即使是这种情况,因为"thing"是私有的,我以为我不能直接修改它.

Bri*_*new 8

您正在从getter公开对数组的引用,并且数组内容本身是可变的,即您可以更改它们.因此,在上面的示例中,您返回对类中私有变量所持有的数组的引用,您修改该数组,并且该更改将通过前进的getter可见,因为它始终返回该已修改的数组.

为避免这种情况,您可以做的是:

  1. 通过getter返回集合的只读视图.这可能很快,但是如果父对象改变你下面的数组内容,而你(比如)迭代它,那么这可能会令人困惑
  2. 通过你的getter 返回一个防御性的副本.这意味着每次调用都会返回一个新的数组副本,这不会改变你,但你为每次调用复制它需要付出代价

在上面的具体示例中,您可以在initialize()方法中创建只读集合,然后您就不会遇到此问题.

我想你需要清楚了.private(即引用变量在类外不可用)和可变(您返回的对象可以更改).这是两个截然不同的概念.