并非所有功能都是多态的

时间:2014-03-14 15:17:19

标签: 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<Integer>();
        return f(myList);
    }   
}

请注意,方法f是多态的,即它可以传递接口List的任何实现。另一方面,方法g不是。在构造对象myList时,如果不知道其类型,它就无法做到这一点。因此,它不能是多态的。我们的代码包含许多遇到同样问题的方法。我们的目标是使我们的代码具有多态性。

  1. 此问题的标准解决方案的名称是什么?
  2. 在这种情况下描述

3 个答案:

答案 0 :(得分:2)

  1. 松耦合有很多方法可以解决这个问题:程序到接口并应用Dependency Injection

  2. 方法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.

你是什么意思?请举例说明。使这段代码更通用的唯一方法是使用CollectionIterable而不是List,但我认为松散耦合方面的技术太过分了。

答案 2 :(得分:0)

显然,这种情况下的解决方案是创建Abstract Factory Pattern

例如,我们创建一个名为AClassCreator的新类,并有一个方法createAClass(List<?> list),其中参数是list的子类。