【问题标题】:Java - Refactoring the code of similar methodsJava - 重构类似方法的代码
【发布时间】:2012-12-27 14:16:45
【问题描述】:

我有以下问题:

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

这是一个例子:

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

出于多种原因,我需要在极少数情况下(例如会话过期等)重试执行此方法,因此我使用了this

所以现在我有这样的东西:

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

【问题讨论】:

  • 你考虑过使用通用静态方法吗?

标签: java exception-handling refactoring salesforce


【解决方案1】:

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

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

}

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

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

【讨论】:

  • 嗯,这些方法不仅有不同的返回类型(Maps、Lists、单个对象),而且采用不同的参数。我不认为泛型解决了我的问题(已经考虑过了)
  • 如果它们采用不同的参数类型,您仍然可以在参数中使用泛型。如果您的意思是它们有不同的 number 个参数,那么您可以创建执行 unique 处理的包装器方法,然后传递给通用方法以进行通用处理。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2011-02-03
相关资源
最近更新 更多