1

次の問題があります。

Salesforce から何かを取得するために基本的に使用されるメソッドがいくつかありました。

次に例を示します。

 public Map<String, Customer> findSomethingByIds(String[] somethingIds) throws... {
     return binding.findSomethingByIds(somethingIds);
 }

非常にまれなケース (fe セッションの期限切れなど) でこのメソッドの実行を再試行する必要があったため、いくつかの理由から、これを使用しました。

だから今、私はこのようなものを持っています:

 public Map<String, Something> findSomethingByIds(final String[] somethingIds) throws ... {       
    Map<String, Something> myList = null;                
    Callable<Map<String, Something>> task = new Callable<Map<String, Something>>() {
        @Override
        public Map<String, Something> call() throws Exception {
            return binding.findSomethingByIds(somethingIds);
        }
    };

    RetriableTask<Map<String, Something>> r = new RetriableTask<>(2, 1000, task);
    try {
        myList = r.call();
    } catch (Exception e) {
        // Ex. handling
    }
    return myList;
}

さて、私のコードにはそのようなメソッドがたくさんあるので、RetriableTask インターフェースを使用したい場合は、上記のものと同様に、これらのメソッドに多くのコードを追加する必要があります。これらのメソッドはすべて異なるものを返すため、ここでは Factory を使用できません (または方法がわかりません)。誰かがこれに対する解決策を知っていますか? どんな助けでも大歓迎です。

4

1 に答える 1

5

同様のことを行うメソッドがあり、唯一の違いが戻り型である場合は、ジェネリックを使用してみてください。

public Map<String, T> findSomethingByIds(final String[] somethingIds) throws ... {       

}

これにより、コードをどこにでもコピーして貼り付けることなく、さまざまなオブジェクトタイプで同等の処理を実行できます。

コメントに応じて、異なるパラメータータイプを使用する場合でも、パラメーターでジェネリックを使用できます。パラメータの数が異なる(つまり、シグネチャが完全に異なる)場合は、そのオブジェクトタイプに固有の処理を実行するラッパーメソッドを作成し、その後、次の汎用メソッドに制御を渡すことができます。すべてのオブジェクトタイプに共通の処理。

于 2012-12-27T14:20:15.837 に答える