Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法让数组在Java中真正私有化?_Java_Arrays_Encapsulation_Access Specifier - Fatal编程技术网

有没有办法让数组在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”-为什么有这个?你不需要什么都有干劲,防御性副本?和任何可变状态一样,如果不想公开它,则需要返回副本或不可变对象。