Для чего используется ключевое слово final в Java?

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

Ответ

Ключевое слово final в Java применяется для объявления сущностей, которые не могут быть изменены после инициализации. Его использование зависит от контекста.

1. final переменные (поля класса, локальные переменные, параметры):

  • Примитивный тип: Значение становится константой и не может быть изменено.
  • Ссылочный тип: Нельзя изменить саму ссылку на объект, но состояние (внутренние поля) объекта можно менять.
    final int MAX_USERS = 100;
    final List<String> names = new ArrayList<>();
    names.add("Alice"); // Можно: изменяем состояние объекта
    // names = new LinkedList<>(); // Ошибка компиляции: нельзя изменить ссылку

2. final методы:

  • Метод нельзя переопределить (override) в классах-наследниках. Используется для фиксации поведения и предотвращения случайного изменения критичной логики в подклассах.
    class PaymentService {
        public final void validateTransaction(Transaction t) {
            // Базовая, неизменяемая логика валидации
        }
    }

3. final классы:

  • Класс нельзя унаследовать (extend). Это используется для обеспечения безопасности (например, класс String — final, чтобы его поведение нельзя было подменить) или для создания неизменяемых (immutable) классов.
    final class SecurityToken {
        // Этот класс не может иметь подклассов
    }
    // class FakeToken extends SecurityToken {} // Ошибка компиляции

Основные причины использования final:

  • Безопасность потоков (Thread Safety): final поля гарантированно инициализируются до завершения конструктора и безопасно публикуются другим потокам без синхронизации.
  • Проектирование и ясность кода: Чётко указывает на намерение, что сущность неизменна.
  • Оптимизация: Компилятор и JVM могут проводить дополнительные оптимизации, зная, что значение не изменится.