Java中的闭包与回调

发表于:2010-7-15 11:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java
  闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域,用过这个定义可以看出内部类是面向对象的闭包因为他不仅包含外围类对象的信息还自动拥有一个指向此外围类对象的引用在此作用域内内部类有权操作所有的成员包括private成员;

  Java代码

interface Incrementable
{
  void increment();
}

class Callee1 implements Incrementable
{
  private int i=0;
  public void increment()
  {
    i++;
    System.out.println(i);
  }
}

class MyIncrement
{
  void increment()
  {
    System.out.println("other increment");
  }
  static void f(MyIncrement mi)
  {
    mi.increment();
  }
}

class Callee2 extends MyIncrement
{
  private int i=0;
  private void incr()
  {
    i++;
    System.out.println(i);
  }
  private class Closure implements Incrementable  //内部类
  {
    public void increment()
    {
      incr();
    }
  }
  Incrementable getCallbackReference()
  {
    return new Closure();   //新建内部类
  }
}

class Caller
{
  private Incrementable callbackRefference;
  Caller(Incrementable cbh)
  {
    callbackRefference = cbh;
  }
  void go()
  {
    callbackRefference.increment();//调用increment()方法
  }
}

public class Callbacks
{
  public  static void main(String [] args)
  {
    Callee1 c1=new Callee1();
    Callee2 c2=new Callee2();
    MyIncrement.f(c2);
    Caller caller1 =new  Caller(c1);
    Caller caller2=new Caller(c2.getCallbackReference());//将内部类中的Closure赋给Caller
    caller1.go();
    caller1.go();
    caller2.go();
    caller2.go();
  }
}

  输出

  otherincrement

  1

  2

  1

  2

  Callee2继承字MyIncrement后者已经有一个不同的increment()方法并且与Incrementable接口期望的increment()方法完全不相关所以如果Callee2继承了MyIncrement就不能为了Incrementable的用途而覆盖increment()方法于是这能使用内部类独立的实现Incrementable

  内部类Closure实现了Incrementable一提供一个放回Caller2的钩子而且是一个安全的钩子无论谁获得此Incrementbale的引用都只能调用increment()除此之外没有其他功能。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号