getter方法如何在数组上工作?

时间:2015-02-06 12:34:55

标签: java getter

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

有人可以解释一下这是如何工作的,以及如何防止用户更改数组单元格的值?

提前致谢。

3 个答案:

答案 0 :(得分:7)

在Java中,array是一种引用类型,这意味着数组表达式的值是对实际数组的引用。

因此,getA()的返回值是对对象内私有数组的引用。这打破了封装:您可以访问对象的内部。

您可以通过返回对内部数组的副本的引用,或者通过提供仅返回单个元素的其他API来避免这种情况,例如方法getA(int index)

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

不是放弃数组,而是让调用者用它做自己喜欢的事情,你可以使用索引的getter

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

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

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