лямда выражение и финальные переменные [дубликат]

176
14 ноября 2018, 05:30

На данный вопрос уже ответили:

  • JavaFX, изменение объектов внутри лямбды 1 ответ

Почему для компилятора код с переменной на уровне класса валидный а на уровне метода нет? Если лямда выражение требует чтобы переменная была финальной, то почему тогда можно использовать не финальную переменную класса?

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, получаем непредсказуемый результат выполнения лямда-функции. Как я понимаю из-за этого и ввели данное ограничение.

Но почему тогда оно не действует на глобальные переменные, мы ведь изменяя их также получаем непредсказуемый результат.

Answer 1

Финальной локальную переменную указывают для компилятора. При выходе из метода все локальные переменные очищаются со стека, а final переменные копируются в хип и синтетические добавляются дополнительным полем в анонимный класс.

Глобальные переменные изначально создаются в хипе, поэтому я ними такой проблемы нет вовсе.

READ ALSO
восстановление бд

восстановление бд

как правильно запускать скрипт восстановление базы?

234
Как найти non-SDK interface в приложении?

Как найти non-SDK interface в приложении?

Если мы указываем в gradle вот эти две строчки

152
Можно ли ускорить время запроса на сервер на Java?

Можно ли ускорить время запроса на сервер на Java?

Мне нужно сделать 700 запросов на различные json

147
Взаимодействие двух программ

Взаимодействие двух программ

Есть змейка, написанная на языке Processing (по факту, это огромная библиотека для Java)Есть алгоритм, который будет играть в змейку, но написанный...

209