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

在Java中實現回調過程

2022-06-13   來源: Java核心技術 

  
  摘要:
  Java接口提供了一個很好的方法來實現回調函數如果你習慣於在事件驅動的編程模型中通過傳遞函數指針來調用方法達到目的的話那麼你就會喜歡這個技巧
  
  作者John D Mitchell
  
  在MSWindows或者XWindow系統的事件驅動模型中當某些事件發生的時候開發人員已經熟悉通過傳遞函數指針來調用處理方法而在Java的面向對象的模型中不能支持這種方法因而看起來好像排除了使用這種比較舒服的機制但事實並非如此
  
  Java的接口提供了一種很好的機制來讓我們達到和回調相同的效果這個訣竅就在於定一個簡單的接口在接口之中定義一個我們希望調用的方法
  
  舉個例子來說假設當一個事件發生的時候我們想它被通知那麼我們定義一個接口
  public interface InterestingEvent
  {
    // This is just a regular method so it can return something or
    // take arguments if you like
    public void interestingEvent ();
  }
  
  這就給我們一個控制實現了該接口的所有類的對象的控制點因此我們不需要關心任何和自己相關的其它外界的類型信息這種方法比C函數更好因為在C++風格的代碼中需要指定一個數據域來保存對象指針而Java中這種實現並不需要
  
  發出事件的類需要對象實現InterestingEvent接口然後調用接口中的interestingEvent ()方法
  
  public class EventNotifier
  {
    private InterestingEvent ie;
  private boolean somethingHappened;
    public EventNotifier (InterestingEvent event)
  {
  // Save the event object for later use
  ie = event;
  // Nothing to report yet
  somethingHappened = false;
  }
    // 
    public void doWork ()
  {
  // Check the predicate which is set elsewhere
  if (somethingHappened)
    {
    // Signal the even by invoking the interfaces method
    ieinterestingEvent ();
    }
  //
    }
    //
  }
  
  在這個例子中我們使用了somethingHappened這個標志來跟蹤是否事件應該被激發在許多事例中被調用的方法能夠激發interestingEvent()方法才是正確的
  希望收到事件通知的代碼必須實現InterestingEvent接口並且正確的傳遞自身的引用到事件通知器
  public class CallMe implements InterestingEvent
  {
  private EventNotifier en;
    public CallMe ()
  {
  // Create the event notifier and pass ourself to it
  en = new EventNotifier (this);
  }
    // Define the actual handler for the event
    public void interestingEvent ()
  {
  // Wow! Something really interesting must have occurred!
  // Do something
  }
    //
  }
  
  希望這點小技巧能給你帶來方便
  
  關於作者
  John D Mitchell在過去的九年內一直做顧問曾經在Geoworks使用OO匯編語言開發了PDA軟件興趣於寫編譯器Tcl/Tk和Java系統和人合著了《Making Sense of Java》目前從事Java編譯器的工作

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25825.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.