类型:Java,创建时间:Dec. 31, 2011, 12:25 a.m.
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/6/。
Java下的闭包(Closure):
public static Runnable outter_func(){ final String param=System.getenv("PATH"); Runnable r=new Runnable(){ public void run(){ System.out.println(param); } }; return r; } r.run();
这是在Java里面使用“闭包”的一个例子。run()
相当于Python里的__call__()
。可以看到在run()
方法里可以使用外层函数的变量。这是怎么做到的呢?答案是,Java在编译的时候做了手脚。r这个类其实还有一个隐藏的属性叫做“var$param”,在run()里面所有的param
被Java编译器偷偷替换成var$param
。此外在r
实例化完成后,Java还调用了:
r.var$param=param
假设param
不是使用final
修饰的变量,当param
指向了另外一个对象的时候,r.var$param
与param
就不是相同的了,这就会产生了语义上的问题。因此,闭包绑定的本地变量必须使用final
修饰。
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/6/。
李俊才(July 9, 2015, 11:09 a.m.)
pl,解决了我的疑惑