Если вы пытаетесь создать массив, чьи ячейки (или подмассивы) не могут быть изменены, вам не повезло. Ячейки массива Java всегда изменяемы.
Если вам нужна неизменность на этом уровне, лучший вариантом является создание класса immutable
обертки для массива:
Для массива с 1-D, я бы рекомендовал Collections.unmodifiableList
или гуавы неизменных коллекции , (Различие между неизменяемыми и неизменяемыми может быть значительным.)
Для массива с более высокими размерами может потребоваться создать пользовательский класс для представления структуры данных с требуемыми характеристиками. Существуют существующие реализации, но у них может не быть подходящей модели для вашего прецедента. (Поиск «Java неизменной матрица» и так далее.)
Если вы счастливы со структурой данных, как это (и его переменчивость характеристики), и вы пытаетесь решить ошибку компиляции в примере, читай дальше.
Проблема с вашей текущей попыткой на самом деле не связана с тем, как работают примитивы или массивы. Проблема в том, что вы пытаетесь назначить final
после того, как она была инициализирована. Вы не можете сделать эту Java.
Есть два решения в данном конкретном случае:
Если инициализация (например, размеры массивов) не зависит ни от чего, что main
является подачи, просто переместить инициализацию массива в классы статической инициализации ; например как было предложено Juvanias.
Если инициализация зависит от материала в main
, тогда вам нужно будет сделать переменные массива в переменные экземпляра final
и выполнить инициализацию в конструкторе.
Нет, 'matrix [0] = новый короткий [] {};' все еще работает. 'subArray' является окончательным, но я все еще могу заменить его в' matrix'. Согласно тому, что я подозревал, и другие подтвердили, это невозможно. – GuiRitter