首頁  >  文章  >  Java  >  java 實作回呼程式碼實例

java 實作回呼程式碼實例

高洛峰
高洛峰原創
2017-01-24 13:30:251260瀏覽

JAVA實作回呼

熟悉MS-Windows和X Windows事件驅動設計模式的開發人員,通常是把一個方法的指標傳遞給事件來源,當某一事件發生時來呼叫這個方法(也稱為「回調”)。 Java的物件導向的模型目前不支援方法指針,似乎無法使用這種方便的機制。

Java支援interface,透過interface可以實現相同的回呼。其訣竅就在於定義一個簡單的interface,申明一個被希望回調的方法。

例如,假定當某一事件發生時會得到通知,我們可以定義一個interface:

public interface InterestingEvent {
 // 这只是一个普通的方法,可以接收参数、也可以返回值
 public void interestingEvent();
}

這樣我們就有了任何一個實現了這個接口類對象的手柄grip。

當一事件發生時,需要通知實作InterestingEvent 介面的對象,並呼叫interestingEvent() 方法。

class EventNotifier {
 private InterestingEvent ie;
 private boolean somethingHappened;
 
 public EventNotifier(InterestingEvent event) {
  ie = event;
  somethingHappened = false;
  }
public void doWork() {<br>        if (somethingHappened) {<br>            // 事件发生时,通过调用接口的这个方法来通知<br>            ie.interestingEvent();<br>        }        <br>    }<br>}

   

在這個例子中,用somethingHappened 來標示事件是否發生。

希望接收事件通知的類別必須要實現InterestingEvent 接口,而且要把自己的引用傳遞給事件的通知者。

public class CallMe implements InterestingEvent {
 private EventNotifier en;
 
 public CallMe() {
  // 新建一个事件通知者对象,并把自己传递给它
  en = new EventNotifier(this);
 }
 
 // 实现事件发生时,实际处理事件的方法
 public void interestingEvent() {
  // 这个事件发生了,进行处理
 }
}

以上是透過一個非常簡單的例子來說明Java中的回呼的實作。

當然,也可以在事件管理或事件通知者類別中,透過註冊的方式來註冊多個對此事件感興趣的物件。

1. 定義一個介面InterestingEvent ,回呼方法nterestingEvent(String event) 簡單接收一個String 參數。

interface InterestingEvent {
 public void interestingEvent(String event);
}

2. 實現InterestingEvent接口,事件處理類別

class CallMe implements InterestingEvent {
 private String name;
 public CallMe(String name){
  this.name = name;
 }
 public void interestingEvent(String event) {
  System.out.println(name + ":[" +event + "] happened");
 }
}

   

3. 事件管理員,或事件通知者

class EventNotifier {
 private List<CallMe> callMes = new ArrayList<CallMe>();
  
 public void regist(CallMe callMe){
  callMes.add(callMe);
 }
  
 public void doWork(){
  for(CallMe callMe: callMes) {
   callMe.interestingEvent("sample event");
  }
 }
}

   

以上就是對Java回呼機制的介紹,有需要的同學可以參考下。

更多java 實作回調程式碼實例相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn