将以下两种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()方法不同
答案 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
方法是否可以以某种方式参数化。
但是,该方法实际上做的是提供ClassA
或ClassB
的实例。分解构造函数调用的一种标准方法是工厂模式。考虑到可能(取决于&#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));