На данный вопрос уже ответили:
Почему для компилятора код с переменной на уровне класса валидный а на уровне метода нет? Если лямда выражение требует чтобы переменная была финальной, то почему тогда можно использовать не финальную переменную класса?
String s = new String("S");
void test() {
//String s = new String("S");//compiler error
Runnable r = () -> {System.out.println(s);};
s = null;
r.run();
}
В данном случае создается анонимный класс с полем ссылающимся на объект new String("S"), вернее поле s = new String("S"). Изменяя переменную в теле метода s = null, получаем непредсказуемый результат выполнения лямда-функции. Как я понимаю из-за этого и ввели данное ограничение.
Но почему тогда оно не действует на глобальные переменные, мы ведь изменяя их также получаем непредсказуемый результат.
Финальной локальную переменную указывают для компилятора. При выходе из метода все локальные переменные очищаются со стека, а final переменные копируются в хип и синтетические добавляются дополнительным полем в анонимный класс.
Глобальные переменные изначально создаются в хипе, поэтому я ними такой проблемы нет вовсе.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости