Java 我可以重构那些方法调用不同但代码结构相同的代码片段吗?
假设您有两个结构完全相同的方法,但它们内部调用的方法不同。所谓“结构”,我指的是相同的逻辑运算符、回调或内部类的方案,即定义执行流程的所有内容。可能的几个用例: 1) 这两个方法相似,但在内部调用上有所不同(methodA和methodB) 2) 方法相似,但因内部调用参数不同而不同(即,方法之间的唯一区别是内部某些调用的重载(methodA)) 是否可以简化此代码并避免代码重复 PS 我使用Java,但希望它不重要 阿斯纳:Java 我可以重构那些方法调用不同但代码结构相同的代码片段吗?,java,generics,refactoring,overloading,Java,Generics,Refactoring,Overloading,假设您有两个结构完全相同的方法,但它们内部调用的方法不同。所谓“结构”,我指的是相同的逻辑运算符、回调或内部类的方案,即定义执行流程的所有内容。可能的几个用例: 1) 这两个方法相似,但在内部调用上有所不同(methodA和methodB) 2) 方法相似,但因内部调用参数不同而不同(即,方法之间的唯一区别是内部某些调用的重载(methodA)) 是否可以简化此代码并避免代码重复 PS 我使用Java,但希望它不重要 阿斯纳: 皮特·贝尔福德(Pete Belford)给出了一个答案,如果我没弄
皮特·贝尔福德(Pete Belford)给出了一个答案,如果我没弄错的话——这里的描述更为详细:我想你在这里寻找的是依赖注入 假设你有两个班,A和B
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方法有许多不同的版本,这些版本仅因输入参数而异 第一种情况可以通过将方法名作为字符串参数传入并使用反射调用来进行推广 第二种情况要困难得多,因为Java不善于动态转换值
请记住,反射会使代码更难阅读/维护。这取决于具体情况。你有没有真正的代码作为例子?代码的草图?那是什么?皮特,你认为这能编译吗?将长值传递给采用整数参数的方法。此外,第二种情况最好由泛型处理,泛型“允许类型或方法在提供编译时类型安全性的同时对各种类型的对象进行操作。”@KutaBeach:更正为int.Pete,当参数集不同时,问题就会出现。您使用相同的参数集对案例进行了编码:2个整数。如果一个方法接受2个整数,另外两个字符串,我该怎么办?Carl,只有在情况下methodA(int a,int b)和methodB(long a,long b)可以作为一个方法用泛型重写。谢谢BetaRide,但使用反射作为重构工具绝对不是我的情况。我只是在想我是否能发明一些技巧来避免复制粘贴。
public class MyCaller {
private Handler handler; //have a setter.
public void callIt(int a, int b) {
handler.myHandler(a, b);
}
}
myHandler(int a, int b);
myHandler(String a, String b);