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