关于java:通过使用其接口类型(Set)而不是其实现类型(HashSet)创建集合可以获得哪些其他好处

What other benefits are available from creating a collection by using its interface type (Set) and not its implementation type (HashSet)

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Coding to interfaces?

我正在从Java中阅读集合教程,它强烈建议使用集合的类型而不是其实际实现类型来实现引用集合的代码。例如:

1
Set<String> s = new HashSet<String>();

它说如果我以后决定更改它,它将给我更改实现的灵活性。

1
Set<String> s = new TreeSet<String>();

除了灵活性之外,使用集合的接口类型实现它还有其他好处吗?


是的,使用接口类时,您将只能访问最默认的方法。这些方法保证是直观的。当使用实现类时,您可能会看到更多的方法,这些方法可能会使您感到困惑或被滥用。

例如:一个集合接口将有一个返回元素数量的方法,比如:size()。但实现类也可能提供一个capacity()方法,告诉您底层数组有多大。

但是正如本教程告诉您的,最重要的原因是您可以不费任何努力就更改实现。更改实现对于性能优化来说可能很有意思,这是非常具体的情况。


接口类型通常包含的方法比实际实现少,这使得以后使用方法很有诱惑力,因为它允许访问这些方法。

然而,这会以一种重要的方式束缚你的双手。例如,如果您决定从使用向量的类的公共方法中公开Vector的返回类型,但后来意识到您的模块将更好地与LinkedList一起使用,那么您现在遇到了一些问题——这将打破使用返回向量的方法的任何问题。

另一方面,如果您首先使用了返回类型List,那么就没有问题了——您可以将内部向量切换到LinkedList,或者实现自己的满足接口列表的东西。根据我的经验,这是一个常见的事件(当然,如果你让它变得困难或不可能,那么它将发生得更少)。

因此,除非您有特定的理由这样做(例如,您需要提供对仅对向量可用的方法的访问),否则始终使用通用接口类型作为返回值。

我知道这仍然是关于灵活性的问题,但从你的帖子中还不清楚你是否理解这一点有多重要。如果您要求使用接口的更好的理由,例如,"如果我不在乎,是否可以使用特定的实现?"灵活性,也就是说,"我不在乎灵活性,想使用特定的类型,可以吗?"答案是,你应该关注灵活性;正如其他人所说的,这是优秀Java编程的一个重要基础。


我认为这里不仅仅是集合,而是多态性:最好使用接口作为声明的类型,因为您可能会更改实现和/或在运行时绑定的具体类。(这里的讨论可能会更长——有很多关于这个的文档/教程——Java基础)