Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getter方法如何在数组上工作?_Java_Getter - Fatal编程技术网

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

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(

我注意到可以通过如下方式访问对象来更改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()[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;
}