Закрытия Scala по сравнению с внутренними классами Java -> final VS var
Я впервые задал этот вопрос об использованииfinal
с анонимными внутренними классами в Java:Почему мы используем ключевое слово final с анонимными внутренними классами?
Я на самом деле читаю книгу Скалы Мартина Одерского. Кажется, Scala значительно упрощает Java-код, но для замыканий Scala я мог заметить существенную разницу.
В то время как в Java мы «имитируем» замыкания с помощью анонимного внутреннего класса, захватывая конечную переменную (которая будет скопирована для хранения в куче, а не в стеке), в Scala мы можем создать замыкание, которое может захватывать val, но также var, и, таким образом, обновите его в вызове замыкания!
Так что мы можем использовать анонимный внутренний класс Java безfinal
ключевое слово! Я еще не дочитал книгу, но пока не нашел достаточно информации об этом выборе языка.
Может кто-нибудь сказать мне, почему Мартин Одерски, который, кажется, действительно заботится о побочных эффектах функции, выбирает замыкания, чтобы иметь возможность захватитьval
а такжеvar
, а не толькоval
?
Каковы преимущества и недостатки реализаций Java и Scala?
Спасибо
Связанный вопрос:В случае закрытий Scala когда захваченные переменные начинают жить в куче JVM?