您的位置:首页 > 编程语言 > Java开发

java学习笔记22——闭包(Closure)和回调

2014-01-24 09:26 316 查看
闭包是一种能被调用的对象,它保存了创建它的作用域信息。java7没有显示支持闭包,但对非静态内部类,不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,所以可以把非静态内部类当成面向对象的闭包。
通过这种仿闭包的非静态内部类,可以很方便的实现回调功能,回调就是某个方法一旦获取了内部类对象的引用后,就可以在合适的时候反过来去调用外部类实例的方法。允许客户类通过内部类引用来调用外部类的方法。

interface Teachable{

void work();

}
class Programmer{

private String name;
//Programmer的两个构造器
public Programmer(){}
public Programmer(String name){

this.name = name;

}
public String getName(){

return this.name;

}
public void work(){

System.out.println(name+"我是程序员,我在写代码");

}

}
class TeachableProgrammer extends Programmer{

public TeachableProgrammer(){}
public TeachableProgrammer(String name){

super(name);

}
private void teach(){

System.out.println(getName()+"我是老师,我在讲课");

}
private class Closure implements Teachable{

/*非静态内部类回调外部类实现work方法,非静态内部类引用的作用仅仅是
*向客户类提供一个回调外部类的途径
*/
public void work(){

teach();

}

}
//返回一个非静态内部类引用,允许外部类通过该非静态内部类引用来回调外部类的方法
//这是一个Teachable的接口类型引用
public Teachable getCallbackReference(){

return new Closure():

}

}
public class TeachableProgrammerTest{

public static void main(String[] args){

TeachableProgrammer tp = new TeachableProgrammer("你王大爷");

//直接调用TeachableProgrammer类从Programmer类继承到的work方法

tp.work();

//表面是调用Cloure的work方法,

//实际上是回调TeachableProgrammer的teach方法

tp.getCallbackReference().work();

}

}

回调就相当于Qt中的信号槽这种。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: