К каким элементам Java-кода можно применить модификатор final?

«К каким элементам Java-кода можно применить модификатор final?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java модификатор final можно применить к четырем основным элементам, накладывая ограничение на их изменение или расширение:

Элемент Эффект Пример
Класс Запрещает наследование от этого класса. final class String { ... }
Метод Запрещает переопределение (override) этого метода в подклассах. public final void getInstance() { ... }
Переменная (поле) Делает ссылку неизменяемой после инициализации. Состояние объекта, на который она указывает, может меняться. final List<String> list = new ArrayList<>();
list.add("item"); // OK
list = new LinkedList<>(); // Ошибка компиляции
Локальная переменная / параметр метода Запрещает повторное присваивание переменной внутри её области видимости. void process(final int param) {
param = 5; // Ошибка компиляции
}

Ключевые моменты:

  • Для примитивных типов final делает значение константой.
  • Для ссылочных типов final фиксирует ссылку, но не содержимое объекта (кроме случаев, когда сам класс immutable, как String).
  • final поля должны быть явно инициализированы до завершения конструктора.
  • Использование final способствует безопасности потоков (thread-safety) для неизменяемых объектов и помогает компилятору в оптимизациях.