可能重复:
Why should the interface for a Java class be prefered?
What is the benefit of polymorphism using Collection interface to create ArrayList object?
我在很多例子中看到,当一个人创建像TreMap这样的集合的实例时,他会使用它的基类作为类型:
Map<String,String> theMap = new TreeMap<String,String>();
为什么不使用
TreeMap<String,String> theMap = new TreeMap<String,String>();
答案 0 :(得分:5)
因为对接口(Map)而不是实现(TreeMap)进行编码被认为是更好的做法。通过这种方式,您可以使用最少的代码接触点自由切换到不同的实现(例如HashMap,如果您以后认为它是更好的解决方案)。
答案 1 :(得分:3)
通常更好的代码是接口,而不是实现,它允许实现更改,而不必更改引用它的代码。
不这样做的唯一合理时间是代码依赖特定实现的特征。例如,如果代码需要快速索引列表项访问ArrayList
,则强制执行特定实现可能是有意义的。
答案 2 :(得分:1)
一般来说,最好针对Interfaces
进行编程,因为它更容易,例如。例如,从TreeMap(有序)切换到HashMap(可能更快)。
如果您在可能的情况下使用接口,则只需更改一个源代码部分。
答案 3 :(得分:1)
原因是Liskov substitution principle。直接引用了所说的话。
设q(x)是关于类型T的对象x可证明的属性。那么对于S类型的对象y,q(y)应该是可证明的,其中S是T的子类型。
简单说明
Map
是interface
interface
是合同在使用Map
时,我们确认了这一点,我们正在使用Map
应该做的合同。
例如
doSomething(Map<String, String> map)
doSomething(TreeMap<String, String> map)
doSomething(Map<String, String> map)
提供了使用任何确认Map
合同的任何实现的选项,允许其任何子类型工作。
doSomething(TreeMap<String, String> map)
是否接受TreeMap
的任何子类型。但TreeMap
不是契约,因此TreeMap
的任何子类型都可能违反其签名/行为(实际上是方法)。因此,与TreeMap
相比,Map
不太可取。 Composition over inheritance可以让你更多地了解这一点。
答案 4 :(得分:0)
这是java最佳实践之一:如果可以的话,使用接口编程。
这有助于使应用程序更加灵活,因为接收此Map的方法也可以在Map的其他实现上工作,但接收TreeMap的方法只能使用TreeMap和它的子项。
如果后者发现HashMap可以提高您的应用程序速度,那么您可以自由地修改方法工作。