【问题标题】:Collections in Java-Better Programming PractiseJava中的集合-更好的编程实践
【发布时间】:2011-12-05 07:05:31
【问题描述】:

在大多数使用集合的 Java 代码中,我看到类似这样的内容。

List<String> list = new ArrayList<String>(); 

但我一直想知道为什么它比它更受欢迎

ArrayList<String> = new ArrayList<String>();

我研究了一点,但不能理解很多。

【问题讨论】:

  • 其实是练习,但那只是我迂腐;)

标签: java collections arraylist


【解决方案1】:

因为当通过其接口使用对象时,您可以稍后更改实现。例如:

public ArrayList<String> doSomething(..) {
    ...
    return arrayList;
}

但一段时间后,ArrayList 似乎对于该方法的调用者最常用的功能来说效率低下,因此您决定将其更改为 LinkedList

  • 如果你的方法只返回 List 你就完成了
  • 如果你的方法返回ArrayList,你应该去所有调用该方法的地方并改变它。如果有人使用了一些特定于数组列表的方法怎么办——你必须考虑如何重构它。这就是好的情况。如果您的代码是一个库并且其他分支机构/公司正在使用它,您可能会遇到效率低下的代码。

另见:

【讨论】:

  • 一般的经验法则是使用您需要的特定类型——仅此而已。因此,如果您需要特定于 LinkedList 的方法,请将其键入 LinkedList 而不是 List;如果您不需要任何特定于 List 的方法,最好将其键入 Collection 而不是 List。
  • 这与上述说法不矛盾吗?
  • 不是,不是。大多数时候,您不需要特定于实现的方法,因此最好将其声明为 List。例如,LinkedList 结合了多个接口,因此如果您需要全部使用它们,您可以合理地声明一个 LinkedList。另一方面,如果您甚至不需要调用 get/set,而只需要一个迭代器,则将其声明为 Collection 甚至 Iterable 可能会更好。
【解决方案2】:

【讨论】:

    【解决方案3】:

    鉴于 Java 是一种强类型语言,它始终被认为是针对接口进行编程的最佳实践(当然,在合理范围内)。这样做可以让您稍后轻松更换实现。

    对于方法参数尤其如此,因为它不会将您绑定到特定的实现。也许您在一种情况下使用ArrayList,但在其他情况下使用LinkedList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多