Ответ
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 — это неявное соглашение, проверяемое компилятором.