Java getter方法如何在数组上工作?
我注意到可以通过如下方式访问对象来更改a的值:Java getter方法如何在数组上工作?,java,getter,Java,Getter,我注意到可以通过如下方式访问对象来更改a的值: 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; } 但这样做是不可能的: foo f = new foo(); f.getA(
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;
}
但这样做是不可能的:
foo f = new foo();
f.getA()[0] = 5; // f.a[0] changes to 5
有人能解释一下这是如何工作的,以及如何防止用户更改数组单元格的值吗
提前感谢。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代码>在Java中,数组是引用类型,这意味着数组表达式的值是对实际数组的引用
因此,getA()
的返回值是对对象内部私有数组的引用。这打破了封装:您可以访问对象的内部
您可以通过返回对内部数组副本的引用,或者通过提供只返回单个元素的不同API来避免这种情况,例如方法getA(int index)
而不是放弃数组,以便允许调用方对其执行他们喜欢的操作。您可以使用索引getter
f.getB = 5; // gives error
f.getA() = new int[]{2,3}; //gives error
现在,调用方无法访问数组,并且在您不知道的情况下无法更改它。所有java参数和结果都是按值传递的。包括数组。但是传递的值(对于引用类型)是引用。或者OP不能使用数组,而是使用不可变集合,例如Guava的ImmutableList
。您的建议相当于使用相同想法的第三方实现(ImmutableList
仍然在内部使用数组)。是的。我只是想补充你的答案,而不是反驳它。如果我们挑剔的话,从int
到Integer
时,内存消耗也会增加六倍。但也许Guava对其不可变容器有原始类型专门化?@MarkoTopolnik:不是针对不可变容器,而是集合。不可修改列表(Ints.asList(array))
就可以了。很好地提到左侧赋值,这在我看来是重要的方面;-)
public int getA(int n){
return this.a[n];
}
public void setA(int n, int x) {
this.a[n] = x;
}