想象一下,你有两种方法具有完全相同的结构,但它们在内部调用的方法不同。 “结构”是指逻辑运算符,回调或内部类的相同方案 - 即定义执行流程的所有方法。几种可能的用例:
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
答案 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不擅长动态转换值。
请记住,反射可能会使您的代码更难以阅读/维护。