Есть ли способ сделать массив действительно частным в Java?
Если я сделаю что-то вроде
private int[] myPrivateArray;
и есть метод получения, который возвращает массив, тогда содержимое массива может быть изменено извне класса, что лишает его цели сделать его закрытым.
3 ответа
Да, есть.
Во-первых, не предоставляйте геттер для этого массива, если это не нужно. Если вы ДОЛЖНЫ предоставить геттер, то передайте копию, а не приватную переменную.
Во-вторых (что было упущено до сих пор), убедитесь, что JVM SecurityManager
настроен, чтобы остановить отражение.
Вы можете предоставить сеттеры, геттеры для определенных индексных элементов массива, так же, как это делают реализации List. Что касается возврата его из функции, вы можете скопировать массив и передать копию. Вместо того, чтобы передавать ссылку на ваш массив, вы передаете ссылку на копию вашего массива.
Как уже говорили другие, вы можете вернуть копию массива:
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;
}
}
Хотя это немного сложнее с массивом примитивов:
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;
}
}