В каких контекстах применяется ключевое слово `final` в Java?

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

Ответ

Ключевое слово final делает сущность неизменяемой и применяется в трёх основных контекстах:

1. Класс (final class) Запрещает наследование от этого класса. Часто используется для обеспечения неизменяемости или безопасности (например, String, Integer).

final class ImmutableCalculator {
    // Невозможно создать подкласс
}

2. Метод (final method) Запрещает переопределение метода в дочерних классах. Используется для фиксации поведения.

class Base {
    public final void criticalOperation() {
        // Логика, которую нельзя менять в наследниках
    }
}

3. Переменная (final variable) Делает ссылку неизменяемой после инициализации. Для примитивов — значение константно.

final int MAX_USERS = 100;
final List<String> log = new ArrayList<>();
// MAX_USERS = 200; // Ошибка компиляции
// log = new LinkedList<>(); // Ошибка: нельзя изменить ссылку
log.add("event"); // Допустимо: изменяется состояние объекта, а не ссылка

Важные нюансы:

  • final для объекта означает неизменность ссылки, а не состояния объекта.
  • Поля final должны быть инициализированы к концу конструктора.
  • Используется для создания констант, обеспечения потокобезопасности и явного проектирования API.