Java中的闭包和回调
该文章参考自《疯狂Java讲义》
闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域信息。
回调,就是某个方法一旦获取了内部类对象的引用后,就可以在合适的时候反过来去调用外部类实例的方法。
一堆理论,看的是一头雾水,直接来个实例就好理解了。
假如有一个Teachable
接口和一个Programmer
基类,它们都有一个work
方法,但是功能却有些不一样,如果某个人既是程序员,也是老师,那么他应该同时拥有两个不同的work
方法,那么,需要来实现Teachable
接口和继承Programmer
类,但是,这两个work
方法的签名完全一样,怎么才能做到既重写Teachable
接口里的work
,又能继承并不重写Prorammer
里的work
方法呢?
这个时候,就可以使用闭包的方式来实现,直接上代码
interface Teachable {
void work();
}
class Programmer {
private String name;
public Programmer() {
}
public Programmer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void work() {
System.out.println(getName() + "在灯下认真地敲键盘");
}
}
public class TeachableProgrammer extends Programmer {
public TeachableProgrammer() {
}
public TeachableProgrammer(String name) {
super(name);
}
private void teach() {
System.out.println(getName() + "在讲台上认真地讲课");
}
private class Clousure implements Teachable {
@Override
public void work() {
teach();
}
}
public Teachable getCallbackRefrence() {
return new Clousure();
}
public static void main(String[] args) {
TeachableProgrammer teachableProgrammer = new TeachableProgrammer("Jack");
teachableProgrammer.work();
teachableProgrammer.getCallbackRefrence().work();
}
}
输出结果
Jack在灯下认真地敲键盘
Jack在讲台上认真地讲课
这里面使用Closure
内部类实现Teachable
接口,然后再通过getCallbackRefrence
方法返回这个内部类的实例对象,那么,直接新创建的TeachableProgrammer
实例,将会拥有程序员的方法,而通过getCallbackRefrence
获取的实例,将会有老师的方法,就做到了两者互不干扰的效果。
这就是闭包的使用,说简单点,就是在外部类的方法中创建的内部类对象的引用,然后调用外部类方法,就可以获得了内部类的引用了。
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1293