У меня есть несколько вопросов о геттерах и сеттерах для массивов. Предположим, у нас есть такой класс, который создает частную копию массива в своем конструкторе:
import java.util.Arrays;
public class Foo
{
private int[] array;
public Foo(int[] array) {
this.array = Arrays.copyOf(array, array.length);
}
}
Мы хотим, чтобы массив мог быть доступен / изменен только через геттеры и сеттеры. Если у нас есть геттер, который выглядит так:
public int[] getArray() {
return array;
}
он побеждает цель получения, так как мы возвращаем ссылку, которая позволяет пользователю напрямую изменять элементы массива. например,
Foo foo = new Foo(someArray);
...
int[] bar = foo.getArray();
bar[0] = 123; // Now foo.array[0] = 123 and we haven't used a setter!
Итак, предположительно, нам нужно что-то вроде этого:
public int getElement(int index) {
return array[index];
}
Аналогично для сеттеров. Но если мы делаем что-то отдельно для каждого элемента, нам также потребуется предоставить способ получения длины:
public int getArrayLength() {
return array.length;
}
Это уже немного грязно для одномерного массива, но скажем, у нас вместо этого многомерный массив:
import java.util.Arrays;
public class Foo
{
private int[][][] array;
public Foo(int[][][] array) {
// Code for making a deep copy here
}
public int getElement(int i, int j, int k) {
return array[i][j][k];
}
public void setElement(int i, int j, int k, int value) {
array[i][j][k] = value;
}
public int getArrayLength() {
return array.length;
}
public int getArrayLength(int i) {
return array[i].length;
}
public int getArrayLength(int i, int j) {
return array[i][j].length;
}
}
Это много кода для такой тривиальной задачи, и что более важно, это беспорядок, который нужно использовать. Нужно ли нам в конечном итоге что-то подобное или есть лучший способ сделать это? Я посмотрел повсюду, и, похоже, для этого нет «стандартной практики».