如何将两个Java方法重构为一个?
将以下两个Java方法重构为一个的最佳方法是什么:如何将两个Java方法重构为一个?,java,Java,将以下两个Java方法重构为一个的最佳方法是什么: public List<AnotherClassA> doSomething(String aString, Integer anInteger) { List<AnotherClassA> listOfClassAObjects; if(condition) { aClassAInstanceVariable = new ClassAConstructor(aString, anInte
public List<AnotherClassA> doSomething(String aString, Integer anInteger) {
List<AnotherClassA> listOfClassAObjects;
if(condition) {
aClassAInstanceVariable = new ClassAConstructor(aString, anInteger);
}
else {
aClassAInstanceVariable = getClassAInstanceVariableFromSomewhere();
}
listOfClassAObjects.add(aClassAInstanceVariable);
return listOfClassAObjects;
}
public List<AnotherClassB> doSomething(String aString, Integer anInteger) {
List<AnotherClassB> listOfClassAObjects;
if(condition) {
aClassBInstanceVariable = new ClassBConstructor(aString, anInteger);
}
else {
aClassBInstanceVariable = getClassBInstanceVariableFromSomewhere();
}
listOfClassAObjects.add(aClassBInstanceVariable);
return listOfClassAObjects;
}
public List doSomething(字符串搜索、整数和整数){
类别对象列表;
如果(条件){
AclassInstanceVariable=新的ClassAConstructor(aString,一个整数);
}
否则{
AclassInstanceVariable=GetClassainStanceVariableFrom某地();
}
添加类对象列表(aClassAInstanceVariable);
类对象的返回列表;
}
公共列表doSomething(字符串搜索、整数和整数){
类别对象列表;
如果(条件){
aClassBInstanceVariable=newclassbconstructor(aString,一个整数);
}
否则{
aClassBInstanceVariable=GetClassBinsTanceVariableFrom某地();
}
添加类对象列表(aClassBInstanceVariable);
类对象的返回列表;
}
区别在于:
- 返回类型不同
- 构造新对象的构造函数(ClassAConstructor和ClassBContractor)是不同的
- getClassXinstanceVariableFromwhere()方法不同
T
类型的实例。您需要将类
作为参数传递:
public <T> List<T> doSomething(Class<T> clazz, String aString, Integer anInteger) {
List<T> listOfClassObjects;
if(condition) {
Constructor<T> constructor = clazz.getConstructor(String.class, Integer.class);
aClassInstanceVariable = constructor.newInstance(aString, anInteger);
}
else {
aClassInstanceVariable = getClassTInstanceVariableFromSomewhere();
}
listOfClassObjects.add(aClassInstanceVariable);
return listOfClassObjects;
}
public List doSomething(类clazz、字符串aString、整数和整数){
类对象列表;
如果(条件){
Constructor=clazz.getConstructor(String.class,Integer.class);
aclasInstanceVariable=constructor.newInstance(aString,一个整数);
}
否则{
aClassInstanceVariable=GetClassTinStanceVariableFrom某地();
}
添加(aclasinstancevariable);
返回类对象列表;
}
并处理适当的异常。将代码剥离为适合在此提问的“伪代码”时,显然会丢失一些信息。目前,没有理由将对象放入列表中,因为列表中只有一个对象,而且通常不清楚列表来自何处。此外,了解测试的
条件的性质可能会有所帮助。还不清楚getclassbinstancevariablefromwhere
方法是否可以参数化
但是,该方法实际上提供的是ClassA
或ClassB
的实例。分解构造函数调用的一种标准方法是工厂模式。考虑到可能(取决于“条件”)没有创建实例的事实,可以将其称为Java 8功能包中as的特例,或者实际上,只是接口的实现
根据实际的代码,可以使用几种应用程序模式
List<ClassA> list = Arrays.asList(functionA.apply(aString, anInteger));
// Or
List<ClassA> list = Arrays.asList(
condition ? functionA.apply(aString, anInteger) : supplierA.get());
// Or (if you wanted to return a list directly)
List<ClassA> list = functionA.apply(aString, anInteger));
List List=Arrays.asList(function.apply(aString,一个整数));
//或
List=Arrays.asList(
条件?函数应用(aString,一个整数):supplierA.get();
//或者(如果您想直接返回列表)
列表=函数应用(aString,一个整数));
可能是,如果您有许多其他类,那么您应该查看访问者模式。此外,您的查询方法(GetClassXinstanceVariableFrom某地())也不同。这两种方法中似乎都存在代码重复。为什么不将公共代码放在单个方法的if块中,或者将其移动到实用程序静态类中呢。这样您就可以重用代码类对象列表。添加将崩溃,因为类对象列表未初始化。@vikeng21是的,刚刚编辑并添加了该差异。因此,这两种方法有3个不同之处在这种情况下,实例变量必须是Object,因为它是唯一可以保存纯泛型类型的对象。此外,还需要对GetClassTinstanceVariableFrom某地进行泛化。