2016-01-09 26 views
0

我想在Java中編寫一個類似於JavaScript的回調系統,我在做的是我通過網絡發送信息時有一個「回調ID」附加到它。當客戶端從服務器接收到這些數據時,它應該爲該集合的回調定位一個集合,並將其與檢索到的數據進行調用。在Java中的回調,類似於Javascript

下面是當前的系統我已經寫了,而要達到這一點:

public class NetworkCallback { 

    private int id; 

    private Callable callback; 

    public NetworkCallback(Callable callback) { 
     this.callback = callback; 
    } 

    public NetworkCallback setId(int id) { 
     this.id = id; 
     return this; 
    } 

    public int getId() { 
     return id; 
    } 

    public boolean execute(JSONObject data) { 
     try { 
      callback.call(); // data? 
      return true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

} 

這些被儲存在特殊容器中的創建將保留指數,它基本上只是一個數組與一些輔助類。當客戶獲取信息時,它將搜索回調並執行它。

void onMessageReceived(byte[] data) { 
    JSONObject json = JSONHelper.fromByteArray(data); 
    int callbackId = json.getInt("cbid"); 
    if(callbackId != 0) { 
     callbacks.fetch(callbackId).execute(json); 
    } 
} 

與此相關的問題我甚至在嘗試運行代碼之前就已經注意到,思考了一會兒,並且跑出了一些需要思考的問題。可調用類不接受參數。因此,例如,說我想通過一個方法,像下面這樣的回調:

method(param JSONObject data) { 
    print data 
} 

授予此方法不會每次它被稱爲時間是一樣的,所以它將在飛行中創建。在我想要實現的JavaScript的例子可以發現如下:

什麼,我想

(function caller() { 
    called(function(data) { 
     console.log("Data: " + data); 
    }); 
})(); 

function called(callback) { 
    callback(Math.random()); 
} 

回答

2

JavaScript示例您將要使用這個Consumer。消費者基本上是可以撥打accept(data)執行回叫的對象。

一個例子:

public class Test { 
    public static void main(String[] args) { 
     Consumer consumer = new Consumer() { 
      @Override 
      public void accept(Object o) { 
       System.out.println(o.toString()); 
      } 
     }; 

     new Test().doSomething("Test", consumer); 
    } 

    public void doSomething(Object data, Consumer<Object> cb) { 
     cb.accept(data); 
    } 
} 

這版畫 「測試」 在控制檯中。