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

时间:2012-12-06 12:50:20

标签: java collections

  

可能重复:
  Coding to interfaces?

我正在阅读Java的Collections教程,强烈建议使用其接口类型而不是实际的实现类型来实现引用Collections的代码。 e.g:

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

它表示如果我决定稍后更改它,它将为我提供更改实施的灵活性。

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

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

3 个答案:

答案 0 :(得分:4)

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

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

但正如教程告诉你的那样,最重要的原因是你可以毫不费力地改变实现。改变实现可能对于性能优化非常有意义。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

接口类型通常包含的方法少于实际实现,因此很容易使用后者,因为它允许访问它们。

然而,这会以显着的方式牵引你的双手。例如,如果您决定从使用向量的类的公共方法中公开返回类型Vector,但后来意识到使用LinkedList可以更好地为您的模块提供服务,那么您现在拥有一些问题 - 这将破坏使用返回向量的方法的任何东西。

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

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

我意识到这仍然是关于灵活性,但是如果你了解它的重要性,你的帖子就不清楚了。如果您要求更好的理由使用接口,即。 “如果我不在乎,可以使用具体的实施方案 灵活性“,即。”我不关心灵活性,想要使用特定类型,这样可以吗?“答案是你应该关心灵活性 ;;)正如其他人所说,这是一个良好的java编程的重要基础。