闭包
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。
回调
允许客户类通过内部类引用来调用其外部类的方法。
闭包与回调的关系
经常发现闭包与回调会一起讨论,那他们之间有什么关系呢?举个例子来说明:
public class OutClass {
private void readBook(){
System.out.println("read book");
}
public InnerClass getInnerClass(){
return new InnerClass();
}
public class InnerClass{
public void read(){
readBook();
}
}
}
在该例种InnerClass即是一个闭包,它包含了OutClass的对象;调用InnerClass的read()方法会回调OutClass的readBook()方法。
所以,闭包是实现回调的一种很灵活的方式
闭包和回调的使用
思考一个场景
假设接口A有一个方法m;接口B也有一个同名的方法m,两个方法的签名完全一样但是功能却不一样。类C想要同时实现接口A和接口B中的方法。因为两个接口中的方法签名完全一致,所以C只能有一个m方法,这种情况下应该怎么实现需求呢?
使用闭包和回调就是一种非常方便有效的解决方法:
public class C implements A{
@Override
public void m() {
System.out.println("it is A");
}
private void o(){
System.out.println("it is B");
}
public D getD(){
return new D();
}
class D implements B{
@Override
public void m() {
o();
}
}
}
public static void main(String[] args) {
C c = new C();
c.m();
c.getD().m();
}