1

我有以下问题:

我有一些方法基本上用于从 Salesforce 获取一些东西。

这是一个例子:

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

由于多种原因,我需要在极少数情况下重试执行此方法(fe session expires 等),所以我使用了这个.

所以现在我有这样的事情:

 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 接口,我必须在这些方法中添加很多代码,类似于上面的那个,我想不惜一切代价避免。所有这些方法几乎都返回不同的东西,所以我不能在这里使用工厂(或者我不知道如何使用)。有谁知道任何解决方案?任何帮助,将不胜感激。

4

1 回答 1

5

如果您有一个方法做类似的事情,唯一的区别是返回类型,请尝试使用泛型

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

}

这将允许您对不同的对象类型执行等效处理,而无需到处复制和粘贴代码。

回应评论,如果它们采用不同的参数类型,您仍然可以在参数中使用泛型。如果您的意思是它们具有不同数量的参数(即具有完全不同的签名),那么您可以创建包装器方法来执行该对象类型独有的处理,然后您可以将控制权传递给通用方法对所有对象类型通用的处理。

于 2012-12-27T14:20:15.837 回答