0

Java での非同期メソッド呼び出し、特に async メソッドの応答値について質問があります。

状況は次のとおりです。

私が呼び出したい非同期メソッドは..

public void getSpeed(IResponseListener listener) {
....
}

リスナーのインターフェースは...

interface IResponseListener {
    public void response(ResponseEvent event);
}

このメソッドは、非同期メソッドに応答値がある場合に呼び出されます

私の問題は、クラスに任意のタイプResponseEventの属性があることです(そして、インターフェースの実装では、値をキャストする必要があります...responseboolean,float,String...)IResponseListener

IResponseListener listener = new IResponseListener {

    public void response(ResponseEvent event) {
        float f = (float)event.response;
    }
}

これはこれを処理するための良い解決策ですか? 悪いことは、応答リスナーが応答のタイプを知っている必要があることだと思います! 応答が任意のタイプであっても、応答を返したい非同期呼び出しを処理するためのより良いソリューションはありますか?

4

4 に答える 4

2

これらの答えの多くは、このように見え始めていると思います->

public interface Function<Args, Value>
{
  public Value call(Args args);
}

戻り値の型は問題ではありません。複数の型を返すことができる場合、「複数の型」は型です...あなたが見ているものを考慮して、JSONの型を提案できますか?

現実には、ハンドラーが事前にタイプを知っているとは期待できないため、それを指定する必要があります。これが戻り値の型であるか、クラスであるかはあなた次第です。

クラス階層を簡単に確認できました。

public class ResponseString implements Function<Args, String>; 
public class ResponseNumber implements Function<Args, Number>;
...
public class ResponseType implements Function<Args, Type>;

または、必要なすべての情報を持つタイプを作成するだけです。要するに、メソッドは型に期待するものを定義でき、それらを拡張することができます。response は、実行可能な関数である可能性があることに注意してください。何かに対して何をすべきかを知っていて、それが何であるかを知らないことは何も悪いことではありません ->

例->

//Admittedly I'd probably have a "Procedure or VoidFunction interface as well".
public yourMethod(Function<String args, Function<String,?> handler)
{
  String hello = "hello";
  Function<String,?> function = handler.call(hello);
  function.call(hello); 
} 

これが役立つことを願っています。ここまで行く理由がない場合もあれば、ある場合もあります。タイプがわからない - 他の誰かがそれを提供してくれることを望んでいるように思えます。

編集:1つのフレームワークでこれを行う例は次のとおりです。

  Applcation.openDialog(Dialog dialog, Callable<Boolean> onClose);

これは、ダイアログがクリーンアップして閉じる場合は true を返し、そうでない場合は false を返します。ここで何が起こるかはあまり気にしません。はい、閉じる、いいえ、しないでください。

于 2012-10-01T20:49:40.190 に答える
1

これが正しいかどうかはわかりませんが、戻り値を別の方法で処理する場合は、期待するさまざまなタイプのオブジェクトで応答メソッドをオーバーロードしてみませんか。ただの提案..

interface InterfaceName{
    void response(float responseVal);
    void response(boolean responseVal);
    ...
}
于 2012-10-01T20:17:37.733 に答える
1

Java ジェネリックを使用します。

interface IResponseListener<T> {
    public void response(T response);
}

次に、匿名クラスで:

IResponseListener listener = new IResponseListener<Float> {

    public void response(Float response) {
        float f = response;
    }
}
于 2012-10-01T20:11:52.387 に答える
0

@nico_ekito の言うとおりにしただろう...または、既存のソリューションを使用します。結果の型がわからないのは問題です。

とにかく、いくつかの調整を行い、ResponseEvent クラスにキャストを任せることができます。

ResponseListener.java

interface IResponseListener {
    void response(ResponseEvent event);
}

ResponseEvent.java

public class ResponseEvent {

   private Object response;

   @SuppressWarnings("unchecked")
   public <T> T getResponse() {
       return (T)response;
   }

   public <T> void setResponse(T response) {
       this.response = response;
   }
}

使用法:

IResponseListener listener = new IResponseListener() {
    public void response(ResponseEvent event) {
        float f = event.getResponse();
    } 
};

ClassCastExceptionあなたのタイプがあなたが期待するものと異なる場合は、 が返されることに注意してください。

于 2012-10-01T20:40:47.753 に答える