如果我做的话
private int[] myPrivateArray;
并且有一个返回数组的getter,然后可以从类外部修改数组内容,这样做会破坏使其成为私有的目的。
答案 0 :(得分:4)
您可以为数组的特定索引元素提供setter,getter,就像List实现一样。至于从函数返回它,您可以复制数组,然后传递副本。您可以将引用传递给数组的副本,而不是将引用传递给您的数组。
答案 1 :(得分:4)
是的,有。
首先,如果你不必要,不要为该阵列提供吸气剂。如果你必须提供一个getter,那么传递一个副本,而不是私有变量。
其次(目前已被忽略),请确保JVM SecurityManager
设置为停止reflection。
答案 2 :(得分:2)
正如其他人所说,你可以返回数组的副本:
public int[]getMyArray(){
return myPrivateArray.clone();
}
或者,您可以提供一个getter来访问数组的各个元素:
public int getMyArray(int index){
return myPrivateArray.get(index);
}
最后,如果你想避免复制但坚持一次返回所有元素,你可以返回数组的不可修改的列表视图:
public class MyClass{
private Object[]myPrivateArray;
private List<Object>myArrayView=Collections.unmodifiableList(Arrays.asList(myPrivateArray));
public List<Object>getMyArrayView(){
return myArrayView;
}
}
虽然这对于一系列基元来说稍微复杂一些:
public class MyClass{
private int[]myPrivateArray;
private List<Integer>myArrayView=new AbstractList<Integer>(){
@Override public int size(){
return myPrivateArray.length;
}
@Override public Integer get(int index){
return myPrivateArray[index]
}
}
public List<Integer>getMyArrayView(){
return myArrayView;
}
}