在JAVA中创建集合实例

时间:2011-11-01 15:09:46

标签: java

  

可能重复:
  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>(); 

5 个答案:

答案 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的子类型。

简单说明

  • Mapinterface
  • interface是合同

在使用Map时,我们确认了这一点,我们正在使用Map应该做的合同。

例如

  1. doSomething(Map<String, String> map)
  2. doSomething(TreeMap<String, String> map)
  3. 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可以提高您的应用程序速度,那么您可以自由地修改方法工作。