java中的闭包(匿名内部类和lambda表达式)

今天在写js的时候遇到了一个问题, 情况大概是这样的: 我希望在for循环中为一个标签添加onclick属性, 但是我发现最终添加的onclick属性始终是最后一次for循环中的i值, 情况是这样的:
javascript闭包

然后我联想到了CoreJava中的一段话:

关于代码块以及自由变量值有一个术语: 闭包。如果有人吹嘘他们的语言有闭包,现在你也可以自信地说 Java 也有闭包。在 Java 中,lambda 表达式就是闭包。

但是我现在看来java的lambda表达式其实不能算是完整的闭包;

在lambda表达式中是可以访问到外部的变量的, 但是有一个条件是这个变量在未来不会变化, 则java认为这是effectively final的, 但是在其他语言, 比如js的闭包中, 外部变量变化之后闭包中的调用也会自动变化;

记得偶尔在一篇博客中提到, lambda表达式只是java8提供的对于匿名内部类的一个语法糖, 本质上还是偷偷默认认为所有在lambda中使用的外部变量都是final的;

回想一下闭包的定义:

内部函数可以访问函数外面的变量。

初次看到这句话的时候我是想到了java的内部类, 因为java的内部类的最大优点就是可以访问外部的变量, 而内部类本身对外部类而言是封装不可见的;

但是java的内部类相比于js的闭包有一个要求, 就是:

内部类所使用的外部变量必须声明为final;

综上所述 大概java中并不能严格说拥有像js一样的闭包吧, 不过这样规定在内部使用的外部变量必须是final大概也是一种不错的编程习惯建议? 嘤嘤嘤~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值