有没有办法让数组在Java中真正私有化?
如果我做了类似的事情有没有办法让数组在Java中真正私有化?,java,arrays,encapsulation,access-specifier,Java,Arrays,Encapsulation,Access Specifier,如果我做了类似的事情 private int[] myPrivateArray; 并且有一个返回数组的getter,那么可以从类外部修改数组内容,这有点违背了将其私有化的目的。可以为数组的特定索引元素提供setter、getter,就像列表实现所做的那样。至于从函数返回它,您可以复制数组,然后传递副本。将引用传递到数组的副本,而不是传递到数组的引用。是的,有 首先,如果不需要,不要为该数组提供getter。如果必须提供getter,则传递一个副本,而不是私有变量 其次(到目前为止一直被忽略),
private int[] myPrivateArray;
并且有一个返回数组的getter,那么可以从类外部修改数组内容,这有点违背了将其私有化的目的。可以为数组的特定索引元素提供setter、getter,就像列表实现所做的那样。至于从函数返回它,您可以复制数组,然后传递副本。将引用传递到数组的副本,而不是传递到数组的引用。是的,有 首先,如果不需要,不要为该数组提供getter。如果必须提供getter,则传递一个副本,而不是私有变量
其次(到目前为止一直被忽略),确保JVM
SecurityManager
设置为停止。正如其他人所说,您可以返回数组的副本:
public int[]getMyArray(){
return myPrivateArray.clone();
}
public int getMyArray(int index){
return myPrivateArray.get(index);
}
或者,您可以提供一个getter来访问数组的各个元素:
public int[]getMyArray(){
return myPrivateArray.clone();
}
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;
}
}
公共类MyClass{
私有对象[]myPrivateArray;
private ListmyArrayView=Collections.unmodifiableList(Arrays.asList(myPrivateArray));
公共列表GetMyArrayView(){
返回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;
}
}
公共类MyClass{
私有int[]myPrivateArray;
私有ListmyArrayView=new AbstractList(){
@重写公共整型大小(){
返回myPrivateArray.length;
}
@重写公共整数get(int索引){
返回myPrivateArray[索引]
}
}
公共列表GetMyArrayView(){
返回myArrayView;
}
}
如果不想从外部更改内容,请返回私有数组对象的副本。相应地使用深度克隆或浅层克隆。“如果我…有一个返回数组的getter”-为什么有这个?你不需要什么都有干劲,防御性副本?和任何可变状态一样,如果不想公开它,则需要返回副本或不可变对象。