如何将两个Java方法重构为一个?

如何将两个Java方法重构为一个?,java,Java,将以下两个Java方法重构为一个的最佳方法是什么: public List<AnotherClassA> doSomething(String aString, Integer anInteger) { List<AnotherClassA> listOfClassAObjects; if(condition) { aClassAInstanceVariable = new ClassAConstructor(aString, anInte

将以下两个Java方法重构为一个的最佳方法是什么:

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某地进行泛化。