Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的回调,类似于Javascript_Java_Callback - Fatal编程技术网

Java中的回调,类似于Javascript

Java中的回调,类似于Javascript,java,callback,Java,Callback,我试图用Java编写一个回调系统,它的工作原理与Javascripts类似,我所做的是通过网络发送信息,并附加一个“回调id”。当客户机从服务器接收到此数据时,它应该从集合中找到该id的回调,并使用检索到的数据调用它 以下是我在尝试实现这一目标时编写的当前系统: public class NetworkCallback { private int id; private Callable callback; public NetworkCallback(Callab

我试图用Java编写一个回调系统,它的工作原理与Javascripts类似,我所做的是通过网络发送信息,并附加一个“回调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);
    }
}   
我甚至在尝试运行代码之前就注意到了这个问题,思考了一会儿,没有什么东西可以考虑了。可调用类不接受参数。例如,假设我想将一个方法作为回调传递,如下所示:

psuedo

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);
    }
}
公共类测试{
公共静态void main(字符串[]args){
消费者=新消费者(){
@凌驾
公共无效接受(对象o){
System.out.println(o.toString());
}
};
新测试().剂量测量(“测试”,消费者);
}
公共无效剂量测量(对象数据、消费者cb){
cb.接受(数据);
}
}
这将在控制台中打印“测试”