为了账号安全,请及时绑定邮箱和手机立即绑定

Lambdas:局部变量需要final,实例变量不需要

Lambdas:局部变量需要final,实例变量不需要

慕妹3146593 2019-08-17 15:38:23
Lambdas:局部变量需要final,实例变量不需要在lambda中,局部变量需要是final,但实例变量不需要。为什么这样?
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

在项目文件lambda:Lambda v4的状态

根据第7节,变量捕获,提到....

我们的意图是禁止捕获可变的局部变量。原因是这样的成语:

int sum = 0;list.forEach(e -> { sum += e.size(); });

基本上是连续的; 写这样没有竞争条件的lambda体是很困难的。除非我们愿意强制执行 - 最好是在编译时 - 这样的函数无法逃避其捕获线程,否则这个特性可能会导致比它解决的更多麻烦。

编辑:

另外需要注意的是,当你在内部类中访问它们时,局部变量在内部类的构造函数中传递,而这对于非最终变量不起作用,因为非最终变量的值可以在构造之后更改。

在实例变量的情况下,编译器传递类的引用,类的引用将用于访问实例变量。因此,在实例变量的情况下不需要它。

PS:值得一提的是,匿名类只能访问最终的局部变量(在JAVA SE 7中),而在Java SE 8中,您可以有效地访问lambda内部的最终变量以及内部类。


查看完整回答
反对 回复 2019-08-17
?
PIPIONE

TA贡献1829条经验 获得超9个赞

因为实例变量总是通过对某个对象的引用的字段访问操作来访问,即some_expression.instance_variable。即使您没有通过点表示法显式访问它,例如instance_variable,它也被隐含地视为this.instance_variable(或者如果您在内部类中访问外部类的实例变量OuterClass.this.instance_variable,那么它是在引擎盖下this.<hidden reference to outer this>.instance_variable)。

因此,永远不会直接访问实例变量,而您直接访问的实际“变量” this(由于它不可分配,因此是“有效的最终”),或者是某个其他表达式开头的变量。


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 668 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号