Java的闭包与final关键字


类型: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$paramparam就不是相同的了,这就会产生了语义上的问题。因此,闭包绑定的本地变量必须使用final修饰。

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/6/。


李俊才(July 9, 2015, 11:09 a.m.)

pl,解决了我的疑惑


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):