getter 方法如何作用于数组?

How do getter methods work on arrays?

public class foo {

private int a[];
private int b;

public foo(){
    a = new int[] {1,2};
    b= 3;
}

public int[] getA(){
    return this.a;
}

public int getB(){
    return this.b;
}

我注意到可以通过像这样访问对象来更改 A 的值:

foo f = new foo();
f.getA()[0] = 5; // f.a[0] changes to 5

但无法执行以下操作:

f.getB = 5; // gives error
f.getA() = new int[]{2,3};  //gives error

谁能给我解释一下这是如何工作的,以及如何防止用户更改数组单元格的值?

提前致谢。

f.get(A) returns 对数组的引用。您可以像访问任何数组一样访问该数组,并使用 f.get(A)[i]=... 为其元素赋值(尽管将返回的数组存储在变量中更有意义,这样您可以多次访问该数组,而无需每次都必须调用 f.get(A))。

但是,您不能通过 f.get(A)=.. 分配任何内容 f.get(A),因为方法调用不是赋值运算符的有效左侧。如您所知,对 f.get(A) 的调用可能会生成一个未被 foo class 成员引用的新数组,因此分配 f.get(A)= new int[5]; 将毫无意义,因为没有变量可以存储新数组。 同样的解释适用于 f.getB() = 5;.

在Java中,数组是引用类型,也就是说数组表达式的值是对实际数组的引用。

因此,getA() 的 return 值是对对象内部私有数组的引用。这会破坏封装:您可以访问对象的内部结构。

您可以通过 return 引用内部数组的 copy 或提供不同的 API 来避免这种情况 API =22=]s 单个元素,比如一个方法 getA(int index).

为了让调用者随心所欲,您可以使用索引 getter

而不是放弃数组
public int getA(int n){
    return this.a[n];
}

public void setA(int n, int x) {
    this.a[n] = x;
}

现在,调用者无法访问该数组,也无法在您不知情的情况下更改它。