我可以重构通过方法调用而不同的代码片段,但在代码结构中是否重合?

时间:2013-08-23 13:32:28

标签: java generics refactoring overloading

想象一下,你有两种方法具有完全相同的结构,但它们在内部调用的方法不同。 “结构”是指逻辑运算符,回调或内部类的相同方案 - 即定义执行流程的所有方法。几种可能的用例:

1)两种方法都相似但不同之处在于它们所做的内部调用(methodA和methodB)

void callIt(int a, int b) {

if (..) {
  methodA();
}

}

void callIt(int a, int b) {

if (..) {
  methodB();
}

}

2)方法类似但内部调用参数参数不同(即方法之间的唯一区别是内部某些调用的重载(methodA))

void callIt(int a, int b) {

if (..) {
  methodA(a, b);
}

}

void callIt(String a, String) {

if (..) {
  methodA(a, b);
}

} 

是否可以简化此代码并避免代码重复?

PS 我使用Java,但希望没关系。

Asnwer: 皮特·贝尔福德给出了一个答案,如果我把他弄错了 - 这里有更多的扩展:Refactoring methods that use the same code but different types

2 个答案:

答案 0 :(得分:1)

我认为你在这里寻找的是依赖注入。

假设您有两个班级,A&乙

public interface Handler {
  myHandler(int a, int b);
}

public class AHandler implements Handler {....}

public class BHandler implements Handler {....}

然后根据一些标准,将正确的处理程序注入调用代码...

public class MyCaller {
    private Handler handler;  //have a setter.

    public void callIt(int a, int b) {
        handler.myHandler(a, b);
    }
}

显然,您可以使用spring框架通过配置执行此注入,但您也可以编写自己的代码。

第二部分可以简单地完成我的面向对象的重载概念。在界面中你可以:

myHandler(int a, int b);
myHandler(String a, String b);

输入变量名称不好,这是许多常见API方法运行的方式。例如,StringBuilder append方法有许多不同的版本,只有输入参数不同。

答案 1 :(得分:0)

第一种情况可以通过将方法名称作为String参数传递并使用反射调用它来推广。

第二种情况要困难得多,因为Java不擅长动态转换值。

请记住,反射可能会使您的代码更难以阅读/维护。