Set*_*arn 9 java arrays getter encapsulation
我从Java开始,我正在学习setter,getters和encapsulation.我有一个非常简单的程序,两个类:
Container
有一个私有的int array(numArray
)与他的setter和getter.
Main
创建一个Container
对象并在totalArray
方法中使用它.
public class Container {
private int numArray[]= {0,0,0};
public int[] getNumArray() {
return numArray;
}
public void setNumArray(int index, int value){
numArray[index] = value;
}
}
public class Main {
public static void main(String[] args) {
Container conte = new Container();
System.out.println(totalArray(conte.getNumArray()));
conte.getNumArray()[2]++;
System.out.println(totalArray(conte.getNumArray()));
}
private static int totalArray (int v[]){
int total=0;
for (int conta =0; conta<v.length;conta++){
total+=v[conta];
}
return total;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:我可以通过getter更改private int数组,我知道这是因为getNumArray
返回引用numArray
,而不是数组本身.如果我对数组的单个元素感兴趣,我会使用索引值创建一个getter,但我想要整个数组用于该totalArray
方法.
如何防止numArray
被修改出他的班级?
您可以做的就是阻止人们更改阵列,只是在getter中提供它的副本.
public int[] getArray() {
return Arrays.copyOf(numArray, numArray.length);
}
Run Code Online (Sandbox Code Playgroud)
这样,其他方法可以更改自己的数组副本,但是当他们再次调用getter时,它们会获得原始版本,不变.只有setNumArray()
您提供的才能实际修改内部数组.
否则,如果要完全阻止容器,则必须删除数组并使用不可变对象.某些库提供不可变列表,或使用Collections.unmodifiableList.
如果要返回一个数组,可以克隆它:
public int[] getArray() {
return (int[]) numArray.clone();
}
Run Code Online (Sandbox Code Playgroud)
在公共API中,您应该确保向调用者清楚地记录(实际上,无论哪种方式,如果他们获得的数组将改变类的状态 - 他们需要知道).