在CoreJava中以打趣的方式有这么一段话:关于代码块以及自由变量值有一个术语: 闭包。如果有人吹嘘他们的语 言有闭包, 现在你也可以自信地说 Java 也有闭包。 在 Java 中, lambda 表达式就是闭包。
但是我现在看来java的lambda表达式其实不能算是完整的闭包;
在lambda表达式中是可以访问到外部的变量的, 但是有一个条件是这个变量在未来不会变化, 则java认为这是effectively final的, 但是在其他语言, 比如js的闭包中, 外部变量变化之后闭包中的调用也会自动变化;
记得偶尔在一篇博客中提到, lambda表达式只是java8提供的对于匿名内部类的一个语法糖, 本质上还是偷偷默认认为所有在lambda中使用的外部变量都是final的;
大家看一下闭包的定义:内部函数可以访问函数外面的变量。
初次看到这句话的时候我是想到了java的内部类, 因为java的内部类的最大优点就是可以访问外部的变量, 而内部类本身对外部类而言是封装不可见的;
但是java的内部类相比于js的闭包有一个要求, 就是:
内部类所使用的外部变量必须声明为final;
综上所述 大概java中并不能严格说拥有像js一样的闭包吧, 不过这样规定在内部使用的外部变量必须是final大概也是一种不错的编程习惯建议? 嘤嘤嘤~