与Java内部类相比,Scala闭包->最终VS var
作者:互联网
我首先问了有关在Java中将final与匿名内部类一起使用的问题:
Why do we use final keyword with anonymous inner classes?
我实际上正在阅读Martin Odersky的Scala书.看来Scala简化了许多Java代码,但是对于Scala闭包,我可以注意到一个明显的不同.
在Java中,我们使用匿名内部类“模拟”闭包,捕获最终变量(该变量将被复制以驻留在堆中而不是堆栈中),在Scala中,我们似乎可以创建可以捕获val的闭包,但是也是一个var,因此可以在闭包调用中对其进行更新!
就像我们可以在不使用final关键字的情况下使用Java匿名内部类一样!
我还没有读完这本书,但是到目前为止,我没有找到关于这种语言设计选择的足够信息.
有人可以告诉我为什么似乎真正照顾到函数副作用的Martin Odersky选择闭包来同时捕获val和var而不是只捕获val吗?
Java和Scala实现的优点和缺点是什么?
谢谢
相关问题:
With Scala closures, when do captured variables start to live on the JVM heap?
解决方法:
可以看到一个对象是一个封闭的包,它们共享对同一环境的访问,并且该环境通常是可变的.那么,为什么要使从匿名函数生成的闭包的功能降低呢?
同样,具有可变变量和匿名函数的其他语言也以相同的方式工作.租赁惊奇原则. Java实际上很奇怪,不允许内部类捕获可变变量.
有时它们只是有用的.例如,自我修改的thunk可以创建您自己的延迟或将来处理的变体.
缺点?它们具有共同的可变状态的所有缺点.
标签:java,scala,closures,inner-classes,anonymous-function 来源: https://codeday.me/bug/20191010/1888045.html