На данный вопрос уже ответили:
Почему для компилятора код с переменной на уровне класса валидный а на уровне метода нет? Если лямда выражение требует чтобы переменная была финальной, то почему тогда можно использовать не финальную переменную класса?
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
переменные копируются в хип и синтетические добавляются дополнительным полем в анонимный класс.
Глобальные переменные изначально создаются в хипе, поэтому я ними такой проблемы нет вовсе.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне нужно сделать 700 запросов на различные json
Есть змейка, написанная на языке Processing (по факту, это огромная библиотека для Java)Есть алгоритм, который будет играть в змейку, но написанный...