以后可以轻松更改界面的实现

时间:2012-01-03 22:31:25

标签: java oop interface

因此在java中,初始化接口(如集合或列表)的方法是创建实现它的类的实例,例如:

Collection<Object> moo = new ArrayList();

如果我想在稍后的代码中指定一个实现,我想通过创建另一个类来实现这一点:

class ListList extends ArrayList{

}

然后用

初始化变量
Collection<Object> moo = new ListList();

如果我想稍后更改实现,那么所有需要的是更改ListList扩展的内容。

所以,这就是问题..是否有更好的方法(我还是觉得我对这类事情缺乏经验)。

3 个答案:

答案 0 :(得分:6)

  

有更好的方法吗

是:使用工厂方法:

public static Collection<Object> createCollection() {
    return new ArrayList<Object>(); // change this later, if need be
}

然后,调用工厂而不是实例化:

Collection<Object> moo = createCollection();

你使用“虚拟”子类的建议可能看起来很有吸引力,但这种继承的滥用总会导致后来的痛苦和痛苦。你真的不想这样做。

答案 1 :(得分:0)

你也可以这样做

Collection<Object> coll=new ArrayList(){
        //bla
    };

答案 2 :(得分:0)

基本理念很好。使变量/ field / ...成为接口的实例而不是您正在使用的具体类。这将强制所有代码对接口起作用(在你没有开始在代码路径的某处开始的情况下),并允许稍后用不同的类替换实现,如果你觉得需要它。

可以开始讨论如何创建具体类,例如使用@skaffman在他的响应中建议的工厂方法。但是,这可能取决于具体情况。如果它只是一次性使用,比如初始化一个字段,你可以创建实例而不必担心工厂方法。