Почему не объявлять окончательный массив сделать его неизменным в 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

Как и все комментируемые, объявление его окончательным не позволит вам назначить другой массив вашей переменной. Подробнее здесь

Сам массив сохранит свойства, как раньше.