熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java中的閉包與回調

2013-11-23 18:43:25  來源: Java核心技術 

  閉包是一個可調用的對象它記錄了一些信息這些信息來自於創建他的作用域用過這個定義 可以看出內部類是面向對象的閉包 因為他不僅包含外圍類對象的信息 還自動擁有一個指向此外圍類對象的引用 在此作用域內 內部類有權操作所有的成員 包括private成員

  Java代碼

  interface Incrementable

  {

  void increment();

  }

  class Callee implements Incrementable

  {

  private int i=;

  public void increment()

  {

  i++;

  Systemoutprintln(i);

  }

  }

  class MyIncrement

  {

  void increment()

  {

  Systemoutprintln(other increment);

  }

  static void f(MyIncrement mi)

  {

  miincrement();

  }

  }

  class Callee extends MyIncrement

  {

  private int i=;

  private void incr()

  {

  i++;

  Systemoutprintln(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()

  {

  callbackRefferenceincrement();//調用increment()方法

  }

  }

  public class Callbacks

  {

  public  static void main(String [] args)

  {

  Callee c=new Callee();

  Callee c=new Callee();

  MyIncrementf(c);

  Caller caller =new  Caller(c);

  Caller caller=new Caller(cgetCallbackReference());//將內部類中的Closure賦給Caller

  callergo();

  callergo();

  callergo();

  callergo();

  }

  }

  輸出

  other increment

  

  

  

  

  Callee 繼承字MyIncrement 後者已經有一個不同的increment()方法並且與Incrementable接口期望的increment()方法完全不相關 所以如果Callee繼承了MyIncrement 就不能為了Incrementable的用途而覆蓋increment()方法 於是這能使用內部類獨立的實現Incrementable

  內部類Closure實現了Incrementable 一提供一個放回Caller的鉤子 而且是一個安全的鉤子 無論誰獲得此Incrementbale的引用 都只能調用increment() 除此之外沒有其他功能


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25624.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.