有没有办法让数组在Java中真正私有?

时间:2016-03-26 04:37:58

标签: java arrays encapsulation access-specifier

如果我做的话

private int[] myPrivateArray;

并且有一个返回数组的getter,然后可以从类外部修改数组内容,这样做会破坏使其成为私有的目的。

3 个答案:

答案 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;
    }
}