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

时间:2014-04-08 16:22:42

标签: java

将以下两种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;
}

差异:

  • 返回类型不同

  • 构造新对象的构造函数(ClassAConstructor和ClassBContractor)是不同的

  • getClassXInstanceVariableFromSomewhere()方法不同

2 个答案:

答案 0 :(得分:0)

您可以创建一个通用方法,通过一些反射帮助来创建类型T的实例。您需要传递Class<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;
}

并处理相应的例外情况。

答案 1 :(得分:0)

当将代码剥离到&#34;虚拟代码时,显然有一些信息丢失了#34;适合在这里提问。目前,没有理由将对象放入列表中,因为列表中只有一个对象 - 而且通常不清楚列表的来源。此外,了解所测试的condition的性质可能会有所帮助。还不清楚getClassBInstanceVariableFromSomewhere方法是否可以以某种方式参数化。

但是,该方法实际上做的是提供ClassAClassB的实例。分解构造函数调用的一种标准方法是工厂模式。考虑到可能(取决于&#34;条件&#34;)没有创建实例的事实,可以将其称为Supplier的特殊情况,如Java 8功能包中,或者实际上,简单地BiFunction接口的实现。

根据真实代码,可以使用多种应用程序模式

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));