簡體   English   中英

Java中的回調,類似於Javascript

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM