因此在java中,初始化接口(如集合或列表)的方法是创建实现它的类的实例,例如:
Collection<Object> moo = new ArrayList();
如果我想在稍后的代码中指定一个实现,我想通过创建另一个类来实现这一点:
class ListList extends ArrayList{
}
然后用
初始化变量Collection<Object> moo = new ListList();
如果我想稍后更改实现,那么所有需要的是更改ListList扩展的内容。
所以,这就是问题..是否有更好的方法(我还是觉得我对这类事情缺乏经验)。
答案 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在他的响应中建议的工厂方法。但是,这可能取决于具体情况。如果它只是一次性使用,比如初始化一个字段,你可以创建实例而不必担心工厂方法。