与Java内部类相比,Scala闭包 - >最终VS var

Seb*_*ber 7 java closures scala anonymous-function inner-classes

我首先问过这个关于final在Java 中使用匿名内部类的问题: 为什么我们使用带有匿名内部类的final关键字?

我实际上正在阅读马丁奥德斯基的Scala书.似乎Scala简化了很多Java代码,但对于Scala闭包,我注意到了一个显着的差异.

在Java中,我们使用匿名内部类"模拟"闭包,捕获最终变量(将被复制到堆上而不是堆栈中),在Scala中我们可以创建一个可以捕获val的闭包,但是也是一个var,因此在闭包调用中更新它!

所以我们可以使用没有final关键字的Java匿名内部类!我还没读完这本书,但是现在我没有找到关于这种语言设计选择的足够信息.

谁能告诉我,为什么马丁Odersky的,谁似乎真的照顾功能的副作用,选择关闭,以便能够同时捕捉valvar,而不是唯一的val

Java和Scala实现的优点和缺点是什么?

谢谢

相关问题: 使用Scala闭包,何时捕获的变量开始存在于JVM堆上?

Jam*_*Iry 8

可以看到一个对象可以共享对同一环境的访问,并且该环境通常是可变的.那么为什么使匿名函数生成的闭包不那么强大呢?

此外,具有可变变量和匿名函数的其他语言也以相同的方式工作.租赁惊讶原则.Java实际上是WEIRD,不允许内部类捕获可变变量.

有时它们只是非常有用.例如,自修改thunk以创建自己的惰性或未来处理变体.

缺点?它们具有共享可变状态的所有缺点.

  • 当我是本科生时,我实施了OO语言.这是我访问过的第一个OO语言.(这在C++之前使OO流行.)与Scala一样,该语言具有词法范围,赋予本地变量,可捕获局部变量的闭包和对象.已经这样做了,我才意识到,对象和类中的其他语言功能方面是定义并迅速消失在面向对象编程的兴趣了几年. (4认同)