Java Lambda运行原理、组合器模式中接口默认方法this指向疑问
你对Lambda的理解大体是正确的,核心逻辑确实是生成对应函数式接口的实例,并且实现其唯一的抽象方法,不过底层实现和普通手写匿名类有几处细节差异,后面会说明。
关于and默认方法里的this指向问题,输出结果完全符合Java语法规则,不用困惑:
- 接口的默认方法本质就是成员实例方法,它的
this指向规则和普通类的实例方法完全一致:谁调用这个and方法,this就指代谁。 - 你看到的输出
combinatorpatttern.CustomerRegistrationValidator$$Lambda$4/0x0000000800067440@12f40c25是JVM为Lambda表达式动态生成的实现类的类名,所有Lambda生成的实现类都会以$$Lambda作为标识,后面的数字是JVM分配的编号,意思就是这个实例是CustomerRegistrationValidator接口的Lambda实现类的对象。
拆解你代码里的调用链会更清楚:
- 第一步执行
isEmailValid(),返回该接口的Lambda实现实例,记为V1 - 第二步调用
V1.and(isPhoneNumberValid()),此时and方法里的this就是V1,这个方法会返回一个新的Lambda实现实例V2 - 第三步调用
V2.and(isAnAdult()),此时and方法里的this就是V2,返回新的Lambda实现实例V3 - 最后调用
V3.apply(customer)触发整条校验链执行
补充Lambda和手写匿名类的核心差异,避免后续踩坑:
你提到的Lambda类似匿名类实例的理解核心是对的,两者主要有两处不同:
- 匿名类编译后会生成独立的
类名$1.class文件,Lambda不会生成静态的class文件,而是通过invokedynamic指令在运行时动态生成实现类 - 如果是在Lambda体内部使用
this,指向的是定义Lambda的外围类实例,而匿名类内部的this指向的是匿名类本身的实例,这是两者行为最大的不同
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

