码迷,mamicode.com
首页 > 编程语言 > 详细

java 中的闭包

时间:2017-10-01 22:08:04      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:enc   绑定   nas   提升   内部函数   vacl   多少   返回   一个   

原文地址:https://sylvanassun.github.io/2017/07/30/2017-07-30-JavaClosure/

 

1.自由变量:

function Add(y) {
    return function(x) {
        return x + y;
    }
}

对于内部函数function(x)来说,y就是自由变量.而y是函数Add(y)内的参数,所以Add(y)对内部函数function(x)形成了一个闭包.

 

JavaJavaScript又或者其他支持闭包的语言不同,它是一个基于类的面向对象语言,也就是说一个方法所用到的自由变量永远都来自于其所在类的实例的.

class AddUtils {  
    private int y = 5;  
    public int add(int x) {
        retrun x + y;
    }
}

这样一个方法add(x)拥有一个参数x与一个自由变量y,它的返回值也依赖于这个自由变量y.add(x)想要正常工作的话,就必须依赖于AddUtils类的一个实例,不然它无法知道自由变量y的值是多少,也就是自由变量未与add(x)进行绑定.

2.严格上来说,add(x)中的自由变量应该为this,这是因为y也是通过this关键字来访问的.

 

3.Java 中的捕获策略是按值捕获

  • capture-by-value: 只需要在创建闭包的地方把捕获的值拷贝一份到对象里即可.Java的匿名内部类和Java 8新的lambda表达式都是这样实现的.
  • capture-by-reference: 把被捕获的局部变量“提升”(hoist)到对象里.C#的匿名函数(匿名委托/lambda表达式)就是这样实现的.

 

4.匿名内部类是 java中闭包的体现

public interface AnonInner() {
    int add();
}
public class Outer {
    
    public AnonInner getAnonInner(final int x) {
        final int y = 5;
        return new AnonInner() {
            public int add() {
                return x + y;
            }
        }
    }
}

getAnonInner(x)方法返回了一个匿名内部类AnonInner,匿名内部类不能显式地声明构造函数,也不能对构造函数传参,且返回的是一个AnonInner接口,但它的add()方法实现中用到了两个自由变量(xy),也就是说外部方法getAnonInner(x)对这个匿名内部类构成了闭包.

 

java 中的闭包

标签:enc   绑定   nas   提升   内部函数   vacl   多少   返回   一个   

原文地址:http://www.cnblogs.com/lemos/p/7617865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!