检索匿名内部类回调中接收的方法的结果?

时间:2012-07-13 16:15:47

标签: 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;
        }
    });
    return result;
}

在这段代码中,我如何返回回调中收到的布尔hasAlerts? 这不起作用,因为结果变量不是最终的。 但是当它是最终的时候,它就不能被修改......

我做过类似的事情:

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服务时发现了这个问题。

2 个答案:

答案 0 :(得分:3)

我可以想到一些变化 - 没有一个特别令人兴奋。您可以将结果持有者和回调合并到一个类中,如果您可以在其他地方使用它,则将其设置为静态,但这并不是一个改进。

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;
}

您可以实现通用同步Future,但这可能会产生误导。

最后,如果您经常这样做,您可以对价值持有人进行一般化。

public class Result<T> {
    private T value;
    public void set(T value) { this.value = value; }
    public T get() { return value; }
}

private boolean isSomethingTrue(String param) {
    final Result<Boolean> result = new Result<Boolean>();
    myService.findBoolean(param,new Callback<Boolean>(
        @Override
        public void onSuccess(Boolean hasAlerts) {
            result.set(hasAlerts);
        }
    });
    return result.get();
}

答案 1 :(得分:1)

您需要的是同步RPC。有关详细信息,请参阅>here<>here<

但我更愿意改变你的编码风格(假设你有权访问调用isSomethingTrue()的代码)。假设你有一些这样的代码调用你的方法isSomethingTrue:

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);
}