闭包与回调

转载自:http://blog.csdn.net/u010142437/article/details/12453501
闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息。Java并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现,因为对于非静态内部类而言,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类的引用,通过它可以访问外部类的私有成员,因此可以把非静态内部类当成面向对象领域的闭包。那么,通过这种仿闭包的非静态内部类可以很方便地实现回调,这是一种非常灵活的功能,比如在这样一个例子中就能用上这种机制:一个Teachable接口和Programmer基类都提供了一个work方法,方法签名完全一样,功能不一样。Teachable的work方法用来执行教学,Programmer的work用来执行编程。那么假如有一个人既是教师又是程序员,也就是需要定义一个类既继承Programmer父类又要实现Teachable,问题在于这个类只能定义一个work方法,那怎么去实现这个需求呢,这里就可以利用内部类可以访问外部类的私有成员的特点来解决这个问题。代码如下:

Teachable接口:

package com.home;  
  
public interface Teachable {  
    public void work();  
}

Programmer基类:

package com.home;  
  
public class Programmer {  
    private String name;  
  
    public Programmer() {  
        super();  
    }  
  
    public Programmer(String name) {  
        super();  
        this.name = name;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public void work() {  
        System.out.println(name + "正在编程");  
    }  
}  

TeachableProgrammer类:

package com.home;  
  
public class TeachableProgrammer extends Programmer {  
  
    public TeachableProgrammer() {  
        super();  
    }  
  
    public TeachableProgrammer(String name) {  
        super(name);  
    }  
  
    // 教学工作任然由TeachableProgrammer定义  
    private void teach() {  
        System.out.println(getName() + "正在讲课");  
    }  
  
    private class Closure implements Teachable {  
  
        @Override  
        public void work() {  
            // 非静态内部类实现Teachable的work方法,作用仅仅是向客户类提供一个回调外部类的途径  
            teach();  
        }  
    }  
  
    // 返回一个非静态内部类的引用,允许外部类通过该引用来回调外部类的方法  
    public Teachable getCallbackReference() {  
        return new Closure();  
    }  
}  

TestClosure[测试]类:

package com.home;  
  
public class TestClosure {  
  
    public static void main(String[] args) {  
        TeachableProgrammer tp = new TeachableProgrammer("李刚");// 该示例来源于李刚老师的疯狂讲义  
        // 直接调用TeachableProgrammer从Programmer类继承下来的work方法  
        tp.work();  
        // 表面上看是调用的Closure的work方法,实际上是通过通过work方法回调TeachableProgrammer的teach方法  
        tp.getCallbackReference().work();  
    }  
  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.成员内部类 可以把一个内部类看做一个成员。成员内部类可以无条件访问外部类的所有成员属性和成员方法。 当成员内部...
    KaelQ阅读 9,533评论 1 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,994评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,665评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,764评论 25 709
  • 助记诗——《艾伦日记51》:亲爱的,我只能陪你到这里! 相爱时难分更难,东风无力百花残。 日醉不觉人间暖,夜吟应觉...
    艾伦教练阅读 1,131评论 0 2