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を返すにはどうすればよいですか?結果変数が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サービスを呼び出そうとしたときに、この問題が見つかりました。

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です。詳細については、 >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);
}
于 2012-07-14T11:28:48.400 に答える