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;
}
现在,调用者无法访问该数组,也无法在您不知情的情况下更改它。
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;
}
现在,调用者无法访问该数组,也无法在您不知情的情况下更改它。