当前位置: 首页 > 面试题库 >

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

田昊天
2023-03-14
问题内容

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

我实际上正在阅读Martin Odersky的Scala书。看来Scala简化了许多Java代码,但是对于Scala闭包,我可以注意到有很大的不同。

在Java中,我们使用匿名内部类“模拟”闭包,捕获最终变量(该变量将被复制以驻留在堆中而不是堆栈中),但在Scala中,我们似乎可以创建可以捕获val的闭包,但是也是一个var,因此可以在闭包调用中对其进行更新!

因此,就像我们可以使用不带final关键字的Java匿名内部类一样!我还没有读完这本书,但是到目前为止,我没有找到关于这种语言设计选择的足够信息。

有人可以告诉我为什么真的似乎在照顾函数副作用的马丁·奥德斯基(Martin
Odersky)选择闭包来同时捕获valvar而不是仅捕获它们val吗?

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

谢谢


问题答案:

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

同样,具有可变变量和匿名函数的其他语言也以相同的方式工作。租赁惊奇的原则。Java实际上很奇怪,不允许内部类捕获可变变量

有时它们只是有用的。例如,自我修改的thunk可以创建您自己的延迟或将来处理的变体。

缺点?它们具有共同的可变状态的所有缺点。



 类似资料:
  • 问题内容: 在Java中,匿名内部类可以在其局部范围内引用变量: 我的问题是这实际上如何实施?如何实现匿名内部实现,为什么必须如此? 问题答案: 编译器会自动为您的匿名内部类生成一个构造函数,并将您的局部变量传递给该构造函数。 构造函数将此值保存在也称为的类变量(字段)中,该变量将在“闭包”中使用。 为什么它必须是最终的?好吧,让我们探讨一下它不在的情况: 在情况A中,还需要更改字段,我们假设这是

  • 主要内容:实例闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: 函数体内有一个变量 i,它作为函数的一个参数。如下面的另一段代码: 在 multiplier 中有两个变量:i 和 factor。其中的一个 i 是函数的形式参数,在 multiplier 函数被调用时,i 被赋予一个新的值。然而,fact

  • 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: val multiplier = (i:Int) => i * 10 函数体内有一个变量 i,它作为函数的一个参数。如下面的另一段代码: val multiplier = (i:Int) => i * factor 在 mult

  • 问题内容: 静态和非静态嵌套类有什么区别? 问题答案: 根据定义,内部类不能是静态的,因此我将重述您的问题为“静态和非静态嵌套类之间有什么区别?” 非静态嵌套类具有对其嵌套的类的成员的完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类无法调用非静态方法或访问嵌套该类的实例的非静态字段。

  • 问题内容: 如果省略,则会看到错误“ 无法在用其他方法定义的内部类中引用非最终变量jtfContent ”。 为什么匿名内部类必须要求外部类实例变量为final才能访问它? 问题答案: 首先,让我们放松一下,请放下那把枪。 好。现在,语言坚持的原因是它作弊是为了让你的内部类函数可以访问他们渴望的局部变量。运行时复制本地执行上下文(以及其他适当的内容),因此它坚持要求你进行所有操作,final以使事

  • 在此代码示例中,ActionListener的actionPerformed函数中没有使用最终对象jLabel: