Почему не объявлять окончательный массив сделать его неизменным в Java?
Почему не объявляется окончательный массив, что делает его неизменным в Java? Не объявляет ли что-то окончательное означает, что его нельзя изменить?
Из вопроса, связанного с неизменяемым массивом, ясно, что объявление окончательного массива не делает его неизменным.
Возможно следующее.
final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;
Мой вопрос: какова функция объявления окончательного здесь?
Ответы
Ответ 1
final
относится только к ссылке, отмеченной им; в Java нет такой вещи, как неизменяемый массив. Когда вы скажете
private final int[] xs = new int[20];
вам не разрешат говорить
xs = new int[10];
позже. Это все, о чем final
. В более общем плане, гарантируя, что объект неизменен, часто трудна работа и полна множества тонкостей. Сам язык не дает многого для этого из коробки.
Ответ 2
final
означает, что вы не можете изменить ссылку - то есть вы не можете назначить другой массив этому полю.
"Неизменяемый" означает, что вы не можете изменить содержимое массива - final
не влияет на это.
Как показывает код, вы можете присвоить значение одному из элементов массива, который не меняет ссылку на массив
Ответ 3
Здесь вы делаете ссылку на объект final
, а не примитив. (Массивы также являются специальными Java-объектами).
Создание ссылки final
означает, что вы не можете заставить ее ссылаться на что-то еще после ее инициализации. Но, конечно, вы можете изменить состояние объекта, связанного с конечной переменной.
Ответ 4
Объявление массива
В Java мы объявляем переменные и создаем объекты (такие как массивы). Эти действия независимы; мы можем объявить переменную без создания объекта и создать объект без объявления переменной.
Неизменяемость - это свойство объекта, а final - свойство переменной. На объект могут ссылаться несколько переменных. Какая переменная должна регулировать неизменность объекта массива?
int[] a = {1,2,3};
final int[] b = a;
a[0] = 10; // should this be legal?
Если мы допустим это, изменилось якобы неизменяемое значение b[0]
. Но как может компилятор предотвратить это? Невозможно присвоить окончательную ссылку окончательной ссылке? Как бы я инициализировал массив? Я не мог сделать это в цикле...
И: Что это означает для того, чтобы массив был неизменным? Например, должен ли следующий компилятор?
final int[][] a = {{1,2}, {3,4}};
a[1][1] = 5;
С++ решает это, разрешая const
указываться (или опущен) для каждого уровня косвенности. В Java окончательный может быть указан (или опущен) один раз для переменной. Да, final
является более простым const
, так же как Java - это более простой С++. Пусть это будет просто, не так ли?
Ответ 5
Это означает, что новый экземпляр объекта не будет разрешен.
Ответ 6
Как и все комментируемые, объявление его окончательным не позволит вам назначить другой массив вашей переменной. Подробнее здесь
Сам массив сохранит свойства, как раньше.