2

我在这里有一个小问题。

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

4

2 回答 2

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

您可以实现一个通用的 synchronous 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();
}
于 2012-07-13T16:40:16.310 回答
1

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

但我更愿意改变你的编码风格(假设你可以访问调用 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);
}
于 2012-07-14T11:28:48.400 回答