60

Callableその呼び出しメソッドへの引数を受け入れることができるインターフェースに似たJavaのインターフェースはありますか?

そのようです:

public interface MyCallable<V> {
  V call(String s) throws Exception;
}

使用できるものがすでに存在する場合は、新しいタイプを作成することは避けたいと思います。または、複数のクライアントに呼び出し可能なルーチンを実装してプラグインさせるためのより良い戦略はありますか?

ここからコピーhttp://www.programmingforums.org/thread27905.html

4

8 に答える 8

51

Java 8以降、java.util.functionパッケージには関数のようなインターフェースのセット全体があります。具体的に求めているのは、単にFunction.

Java 8 より前のバージョンでは、このための汎用の組み込みインターフェースはありませんでしたが、一部のライブラリで提供されていました。

たとえば、グアバにはメソッドとFunction<F,T>インターフェースT apply(F input)があります。また、いくつかの場所でそのインターフェイスを多用しています

于 2012-06-18T13:27:44.427 に答える
9

最初は、これはインターフェイスで行われると考えていましたが、抽象クラスを使用して行う必要があることがわかりました。

私はこのように解決しました:


編集:最近、私はこれを使用しています:

    public static abstract class callback1<T>{
         public abstract  void run(T value);
    }

    public static abstract class callback2<T,J>{
         public abstract  void run(T value,J value2);
    }

    public static abstract class callback3<T,J,Z>{
         public abstract  void run(T value,J value2,Z value3);
    }


    public static abstract class callbackret1<R,T>{
         public abstract  R run(T value);
    }

    public static abstract class callbackret2<R,T,J>{
         public abstract  R run(T value,J value2);
    }

    public static abstract class callbackret3<R,T,J,Z>{
         public abstract  R run(T value,J value2,Z value3);
    }

CallBack.java

public abstract class CallBack<TRet,TArg> {
    public abstract TRet call(TArg val);
}

メソッドの定義:

class Sample2 
{
    CallBack<Void,String> cb;
    void callcb(CallBack<Void,String> CB)
    {
     cb=CB; //save the callback
     cb.call("yes!"); // call the callback
    }
}

使用方法:

sample2.callcb(new CallBack<Void,String>(){
        @Override
        public Void call(String val) {
            // TODO Auto-generated method stub
            return null;
        }
    });

2 つの引数の例: CallBack2.java

public abstract class CallBack2<TRet,TArg1,TArg2> {
    public abstract TRet call(TArg1 val1,TArg2 val2);
}

Void 戻り型を使用する場合は、return null を使用する必要があることに注意してください。通常、コールバックは値を返さないため、これを修正するバリエーションを次に示します。

戻り型としての void: SimpleCallBack.java

public abstract class SimpleCallBack<TArg> {
    public abstract void call(TArg val);
}

戻り型 2 引数として void: SimpleCallBack2.java

public abstract class SimpleCallBack<TArg1,TArg2> {
    public abstract void call(TArg1 val1,TArg2 val2);
}

インターフェイスはこれには役に立ちません。

インターフェイスは、複数の型が同じ型に一致することを許可します。事前定義された一連の関数を共有することによって。

抽象クラスを使用すると、その中の空の関数を後で完成させることができます。拡張時またはインスタンス化時。

于 2013-08-31T08:32:18.787 に答える
5

最近、同じ要件がありました。他の人が説明したように、多くのライブラリは「機能的な」メソッドを提供しますが、これらは例外をスローしません。

一部のプロジェクトがどのように解決策を提供したかの例は、「X」が 0 ... N ( callメソッドの引数の数) であるActionXなどのインターフェイスを使用するRxJavaライブラリです。varargs インターフェイスActionNもあります。

私の現在のアプローチは、単純な汎用インターフェイスを使用することです。

public interface Invoke<T,V>  {     
    public T call(V data) throws Exception;     
//  public T call(V... data) throws Exception;    
}

私の場合は2番目の方法が望ましいですが、IDEで「型の安全性:可変引数パラメーターデータによるヒープ汚染の可能性」が表示され、それはまったく別の問題です。

私が検討している別のアプローチは、例外をスローしないjava.util.concurrent.Callableなどの既存のインターフェースを使用することです。私の実装では、未チェックの例外で例外をラップします。

于 2013-12-15T13:10:30.447 に答える
1

答えはあいまいです。厳密に言えば、つまり「Callableインターフェースと同じ目的のために」はありません。

同様のクラスがあり、必要なものに応じて、便利な場合とそうでない場合があります。それらの1つはSwingWorkerです。ただし、その名前が示すように、Swingフレームワーク内で使用するために設計されました。他の目的にも使用できますが、これは設計上の選択としては不適切です。

私の最善のアドバイスは、システムですでに使用しているライブラリに応じて、拡張ライブラリ(Jakarta-Commons、Guavaなど)によって提供されるものを使用することです。

于 2012-06-18T13:33:11.083 に答える
0

メソッドはコンストラクターに任意の数の引数を持つことができるため、通常、引数は必要ありません。

final int i = 5;
final String word = "hello";

Future<String> future = service.submit(new Callable<String>() {
    public String call() {
        return word + i;
    }
});

この例iでは とwordが使用されていますが、任意の数のパラメーターを「渡す」ことができます。

于 2012-06-18T14:00:24.097 に答える