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