![](/img/trans.png)
[英]Why do I need to have setter methods when getter methods do the same work for me?
[英]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
誰能解釋一下這是如何工作的,以及如何防止用戶更改數組單元格的值?
提前致謝。
在Java中,array是一種引用類型,這意味着數組表達式的值是對實際數組的引用。
因此, getA()
的返回值是對對象內私有數組的引用。 這打破了封裝:您可以訪問對象的內部。
您可以通過返回對內部數組副本的引用,或者通過提供僅返回單個元素的不同API來避免這種情況,例如方法getA(int index)
。
f.get(A)
返回對數組的引用。 您可以像訪問任何數組一樣訪問該數組,並使用f.get(A)[i]=...
為其元素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;
。
而不是放棄數組,允許調用者用它做他們喜歡的事情,你可以使用索引的getter
public int getA(int n){
return this.a[n];
}
public void setA(int n, int x) {
this.a[n] = x;
}
現在,調用者無法訪問數組,並且在您不知情的情況下無法更改它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.