Java中的闭包和回调

该文章发布于 ,归类于 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获取的实例,将会有老师的方法,就做到了两者互不干扰的效果。

这就是闭包的使用,说简单点,就是在外部类的方法中创建的内部类对象的引用,然后调用外部类方法,就可以获得了内部类的引用了。

相关文章