来自没有解决方案的旧考试:
鉴于此代码......
import java.util.*;
public class AClass {
private int f(List<Integer> list){
int i = 0;
//Something useful
return i;
}
public int g() {
List<Integer> myList = new LinkedList<Integer>();
return f(myList);
}
}
请注意,方法f
是多态的,即它可以传递接口List的任何实现。另一方面,方法g
不是。在构造对象myList
时,如果不知道其类型,它就无法做到这一点。因此,它不能是多态的。我们的代码包含许多遇到同样问题的方法。我们的目标是使我们的代码具有多态性。
答案 0 :(得分:2)
松耦合有很多方法可以解决这个问题:程序到接口并应用Dependency Injection
方法g()
与LinkedList
紧密耦合,因为该方法明确地实例化该对象,因此对该类很紧。如果您想使用ArrayList
,则需要打开该类并显式修改该方法并可能引入错误。此外,您可能需要重新测试和记录。另一方面,方法f()
更灵活,因为您可以只传递所需的集合,并且该方法没有关于您传递的具体实现的概念,以此方式关闭。
答案 1 :(得分:0)
Consequently, it cannot be polymorphic. Our code contains many methods suffering from the same problem. We aim to make our code polymorphic.
你是什么意思?请举例说明。使这段代码更通用的唯一方法是使用Collection
或Iterable
而不是List
,但我认为松散耦合方面的技术太过分了。
答案 2 :(得分:0)
显然,这种情况下的解决方案是创建Abstract Factory Pattern
。
例如,我们创建一个名为AClassCreator
的新类,并有一个方法createAClass(List<?> list)
,其中参数是list的子类。