[英]Callbacks in Java, similar to Javascript
我正在嘗試用Java編寫一個類似於Javascript的回調系統,我正在做的是我正在通過網絡發送附加了“回調ID”的信息。 當客戶端從服務器接收回該數據時,它應該從集合中找到該ID的回調,並使用檢索到的數據進行調用。
這是我為實現此目的而編寫的當前系統:
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示例:
我想要的Javascript示例
(function caller() {
called(function(data) {
console.log("Data: " + data);
});
})();
function called(callback) {
callback(Math.random());
}
您將為此使用使用者 。 使用者基本上是可以在其上調用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);
}
}
這將在控制台中打印“測試”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.