gpt4 book ai didi

java - 需要有关 Java 回调和匿名类的帮助

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:00 25 4
gpt4 key购买 nike

我正在使用一些第三方库通过异步协议(protocol)连接到服务器并获得响应。例如,通过用户名获取用户 ID 的方法如下所示:

public int getUserid(String username) {
int userid = 0;

connection.call("getUserid", new Responder() {
public void onResult(final int result) {
System.out.println("userid: " + result);
//how to assign received value to userid and return it?
}
}, username);

//wait for response
while (userid == 0) {
try{
Thread.sleep(100);
} catch (Exception e) {}
}


return userid;
}

问题是我无法将从服务器响应返回的“结果”分配给方法的“userid”变量(以便之后返回它)。如何解决这个问题?我可能可以将它分配给某个类变量而不是方法变量,但我想将它保留在方法范围内,这样我就不必处理并发问题。

谢谢。

最佳答案

如果我对你的问题的理解正确,你是在问如何从匿名类中编写变量。

匿名类只能访问最终变量,不能直接“写入”它们。

一个“足够好”的直接解决方案是创建一种具有单个值字段以及 getter 和 setter 的 ValueBox 类。然后您可以在函数中实例化一个新变量作为最终变量,并让您的匿名类访问它。匿名类将使用其 getter 和 setter 进行写入/读取。

变量是 final 的事实仅意味着您不能将引用指向其他任何地方,但您仍然可以从任一函数更改引用对象的内容。

您将遇到的更大问题是等待回调被调用。这种等待 sleep 可能就足够了,但您可能需要考虑超时、线程等,具体取决于您要实现的目标。

此外,这一切都假设您永远不会在连接上调用它两次。否则,您需要向我们提供有关您的同步模型的更多信息。

下面是一些示例代码:

public int getUserid(String username) {
final ValueBox<Integer> userid = new ValueBox<Integer>();

connection.call("getUserid", new Responder() {
public void onResult(final int result) {
System.out.println("userid: " + result);
userId.setValue(result);
//how to assign received value to userid and return it?
}
}, username);

//wait for response
while (userid.isEmpty()) {
try{
Thread.sleep(100);
} catch (Exception e) {}
}

return userid.getValue();
}

关于java - 需要有关 Java 回调和匿名类的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/918721/

25 4 0