Java 不是所有函数都是多态的
从没有解决方案的旧考试中: 鉴于此代码Java 不是所有函数都是多态的,java,Java,从没有解决方案的旧考试中: 鉴于此代码 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
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);
}
}
import java.util.*;
公共类AClass{
专用int f(列表){
int i=0;
//有用的东西
返回i;
}
公共int g(){
List myList=newlinkedlist();
返回f(myList);
}
}
请注意,方法f
是多态的,即它可以传递给接口列表的任何实现。另一方面,方法g
不是。当它构造对象myList
时,如果不知道其类型,它就无法执行此操作。因此,它不能是多态的。我们的代码包含了许多遭受相同问题的方法。我们的目标是使代码具有多态性
g()。例如,如果要使用ArrayList
,则需要打开该类并显式修改该方法,并可能引入bug。此外,您可能需要重新测试并记录。另一方面,方法f()
更加灵活,因为您可以只传递所需的集合,而该方法不知道您正在传递的具体实现,从而保持方法的关闭
你这是什么意思?请举例说明。使此代码更通用的唯一方法是使用
集合
或可伸缩
,而不是列表
,但我认为这在松耦合方面是一种过激的做法。显然,这种情况下的解决方案是创建一个抽象工厂模式
例如,我们将创建一个名为
AClassCreator
的新类,并有一个方法createAClass(List List)
,其中参数是List的子类。1。或者:编程到接口。松耦合更具包容性。回答不错。最好使用您需要的接口(List
),而不是具体的实现(LinkedList
,ArrayList
等)。如果需要使用接口中未定义的特定于该类的方法,您可以稍后使用该类。您可以插入类似于Provider
的内容,但是引用计算机科学中的所有问题都可以通过另一个间接层次来解决。。。除了间接寻址层太多的问题。
这里想到;)@Bartzilla-调用newLinkedList()
不是紧密耦合,即创建列表实例。紧密耦合会将LinkedList传递到f()。@ike_love您显然不理解DI的概念。首先,如何创建列表的实例?你不能!列表是一个接口。迪就是这样!!将可能更改的对象(例如工厂等)的实例化外部化,这样您就可以不必维护经过测试、记录和编译的类。在这种情况下,如果需要其他类型的列表,LinkedList可能会更改发生的情况?哦,好吧!您将需要打开该类并对其进行修改,并且可能会破坏它。这正是你错的地方!我建议你读一本关于DI的好书。
Consequently, it cannot be polymorphic. Our code contains many methods suffering from the same problem. We aim to make our code polymorphic.