Главная » Java » Поля final Java

0

Значение переменной, снабженной модификатором final, после инициализации уже не может быть изменено, так как любая попытка присваивания переменной нового содержимого приводит к ошибке времени компиляции. Мы уже говорили о полях final, исполняющих функции именованных констант, – такое их применение вполне оправданно, поскольку константы по определению неизменны. Модификатор final применяется для обозначения постоянства некоторого свойства класса или объекта на протяжении всего его жизненного цикла.

Если поле, помеченное как final, лишено инициализатора, его принято называть blank final. Наличие возможности подобного объявления весьма полезно в тех случаях, когда для инициализации поля простого выражения недостаточно. Поле final должно быть инициализировано только единожды в ходе инициализации класса (в случае, если поле statiс) либо в процессе конструирования объекта класса (если поле не статическое). Компилятор проверяет, выполнена ли такая операция, и выдает сообщение об ошибке, если выявляет, что поле final не получило соответствующего исходного значения.

Необходимость придания полю свойства неизменности определяется его смысловым назначением в контексте всего приложения. Размышляя над тем, следует ли обозначить конкретное поле как final, попытайтесь дать ответы на следующие вопросы.

·     Действительно ли поле служит для представления какого-либо стабильного, устойчивого свойства объекта?

·     Всегда ли исходное значение поля известно к моменту создания объекта?

·      Удобно и практично ли инициализировать поле при построении объекта?

Если известно, что свойство, строго говоря, нельзя назвать подлинно стабильным, хотя частота его изменения и невелика, модификатор final применять не следует.

Если к моменту создания объекта значение поля не определено – пусть по своему смыслу оно и абсолютно устойчиво, – поле и в этом случае не может быть помечено признаком final. Возвратимся к примеру класса Body, служащего для представления данных о космических телах. Комета, скажем, может однажды попасть в гравитационное поле звезды и превратиться в спутник этой звезды. Спутник вращается вокруг звезды по орбите (вспомните назначение поля orbits класса Body) вечно или до тех пор, пока не будет разрушен. В подобной ситуации полю orbits будет присвоено неизменное значение – и только один раз, – но, увы, оно не известно в создания объекта, описывающего комету, и поэтому поле нельзя снабдить модификатором final. Наконец, если процесс инициализации поля связан с (например, ощутимыми затратами процессорного времени) и значение поля используется нечасто, можно порекомендовать более разумное решение – отложить операцию инициализации до тех пор, пока содержимое поля не будет реально востребовано. Разумеется, и в этом случае признак final  использовать запрещено.

Существуют и другие аспекты применения модификатора final, связанные с объявлением полей объектов, которые допускают клонирование, - внимание подобным вопросам уделено в разделе 3.9 на странице 111.

Упражнение 2.4. Еще раз рассмотрите решение, предложенное вами для упражнения 2.3. Как вы полагаете, следует ли пометить поле для хранения номера автомобиля признаком final?

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии