簡體   English   中英

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

誰能解釋一下這是如何工作的,以及如何防止用戶更改數組單元格的值?

提前致謝。

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM