Java 检索在匿名内部类回调中接收的方法的结果?
我有个小问题Java 检索在匿名内部类回调中接收的方法的结果?,java,gwt,scjp,Java,Gwt,Scjp,我有个小问题 private boolean isSomethingTrue(String param) { boolean result = false; myService.hasAlerts(param,new Callback<Boolean>( @Override public void onSuccess(Boolean hasAlerts) { result = hasAlerts;
private boolean isSomethingTrue(String param) {
boolean result = false;
myService.hasAlerts(param,new Callback<Boolean>(
@Override
public void onSuccess(Boolean hasAlerts) {
result = hasAlerts;
}
});
return result;
}
在这段代码中,如何返回回调中接收到的布尔hasAlerts?
这不起作用,因为结果变量不是final。
但当它是最终的,它不能被修改,所以
我做过类似的事情:
private boolean isSomethingTrue(String param) {
class ResultHolder {
boolean result=false;
}
final ResultHolder resultHolder = new ResultHolder();
myService.findBoolean(param,new Callback<Boolean>(
@Override
public void onSuccess(Boolean hasAlerts) {
resultHolder.result = hasAlerts;
}
});
return resultHolder.result;
}
但有没有更简单的解决办法来处理这种情况
我在尝试调用GWT RPC服务时发现了这个问题。我能想到一些变体,它们都不是特别令人兴奋的。如果可以在其他地方使用,可以将结果持有者和回调合并到单个类中,并使其成为静态的,但这并不是真正的改进
private boolean isSomethingTrue(String param) {
class MyCallback implements Callback<Boolean> {
boolean result = false;
@Override
public void onSuccess(Boolean hasAlerts) {
result = hasAlerts;
}
}
final MyCallback callback = new MyCallback();
myService.findBoolean(param, callback);
return callback.result;
}
我能想到一些变化,但没有一个特别令人兴奋。如果可以在其他地方使用,可以将结果持有者和回调合并到单个类中,并使其成为静态的,但这并不是真正的改进
private boolean isSomethingTrue(String param) {
class MyCallback implements Callback<Boolean> {
boolean result = false;
@Override
public void onSuccess(Boolean hasAlerts) {
result = hasAlerts;
}
}
final MyCallback callback = new MyCallback();
myService.findBoolean(param, callback);
return callback.result;
}
您需要的是一个同步RPC。请参见>此处您需要的是同步RPC。请参见>此处,您的逻辑不起作用。原因是在执行onSuccess方法之前返回结果,因为函数是异步的。@GaneshKumar-看起来hasAlerts不是异步的。它在返回之前调用onSuccess。在这种情况下,方法是同步的。否则就没有任何意义了你的逻辑不起作用。原因是在执行onSuccess方法之前返回结果,因为函数是异步的。@GaneshKumar-看起来hasAlerts不是异步的。它在返回之前调用onSuccess。在这种情况下,方法是同步的。否则就没有任何意义了,谢谢,这似乎是个好主意,因为我的方法是在这里知道我是否应该显示GWT按钮。因此,我想我可以直接在回调中添加创建按钮的代码,因为我将按钮添加到了一个全局变量中。谢谢,这似乎是个好主意,因为我的方法在这里知道是否应该显示GWT按钮。因此,我想我可以直接在回调中添加创建按钮的代码,因为我将按钮添加到了一个全局变量中。
if(isSomethingTrue("foo")) {
doSomeCoolStuff();
}
isSomethingTrue("foo", new Callback<Boolean>(
@Override
public void onSuccess(Boolean result) {
if(result) {
doSomeCoolStuff();
}
}
});
private void isSomethingTrue(String param, Callback callback) {
myService.hasAlerts(param,callback);
}