Что такое effectively final переменная в Java?

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

Ответ

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

Почему это важно: Начиная с Java 8, такие переменные можно использовать внутри лямбда-выражений и анонимных классов, что раньше было разрешено только для явно final переменных. Это предотвращает ошибки, связанные с изменением захваченных переменных из замыкания.

Пример:

int threshold = 10; // effectively final переменная
// threshold = 20; // Если раскомментировать, переменная перестанет быть effectively final

List<String> filtered = list.stream()
    .filter(s -> s.length() > threshold) // Использование в лямбде допустимо
    .collect(Collectors.toList());

Отличие от final: Переменная final требует явного объявления и не может быть изменена. Effectively final — это неявное соглашение, проверяемое компилятором.