14

我知道在通用出现之前已经问过这个问题。Array 确实胜出了一点,因为 Array 强制执行返回类型,它更安全。

但是现在,使用最新的 JDK 7,每次我设计这种类型的 API 时:

public String[] getElements(String type)
vs
public List<String> getElements(String type)

我一直在努力想出一些很好的理由来返回 A Collection over An Array 或其他方式。选择 String[] 或 List 作为 API 的返回类型时,最佳实践是什么?或者是马的课程。

我没有特殊情况,我更多的是寻找通用的优缺点比较。

4

5 回答 5

14

如果您正在编写公共 API,那么您的客户通常会更喜欢集合,因为它们更易于操作并与代码库的其余部分集成。另一方面,如果您希望在对性能高度敏感的上下文中使用公共 API,则首选原始数组。

如果您是为自己使用而编写此代码,则最佳实践是从集合类型开始,并且仅在存在明确的性能问题时才切换到数组。

数组的元素类型可以在运行时通过反射确定,因此如果该特定功能对您很重要,那将是另一种更喜欢数组的情况。

于 2012-11-29T10:53:59.980 回答
12

这是部分列表

阵列的优点:

  • 快速地
  • 天生易变
  • 你确切地知道“你得到什么”(什么是类型)——所以你确切地知道返回的对象将如何表现。

列表的优点:

  • 行为取决于返回的实际类型(例如 - 根据实际类型可以是可变的或不可变的)
  • 更好的招聘设计
  • (取决于实际类型)可能是动态大小
  • 更直观hashCode()equals()- 如果将基于散列的集合作为键输入,这可能很关键。
  • 类型安全:

    String[] arr1 = new String[5]; 
    Object[] arr2 = arr1;
    arr2[0] = new Object(); //run time error :(
    List<String> list1 = new LinkedList<String>();
    List<Object> list2 = list1; //compilation error :)
    
于 2012-11-29T10:55:20.020 回答
3

如果我有选择,我会选择 Collection,因为我在 Java 中“免费”获得了额外的行为。

实现到接口

最大的好处是,如果您返回 Collection API(甚至是 List、Set 等),您可以轻松更改实现(例如 ArrayList、LinkedList、HashSet 等),而无需使用该方法更改客户端。

添加行为

Java Collections类提供了许多可应用于集合的包装器,包括

  1. 同步集合
  2. 使集合不可变
  3. 搜索、倒车等...
于 2012-11-29T11:00:02.913 回答
0

当您公开一个公共 API 时,返回一个 Collection 是很有意义的,因为它通过使用其上可用的各种方法使客户端的生活更轻松。toArray()如果需要特殊情况的数组表示,客户可以随时调用。

与其他模块的集成也变得更容易,因为大多数 API 都期望收集,因此也可以工作。

于 2012-11-29T11:01:41.737 回答
0

在我看来,这取决于返回值的用途。

如果返回的值将被迭代,没有别的,数组是最好的选择,但如果结果将被操纵,那么去适当的集合。

但要小心,例如,List 应该允许重复,而 Set 不应该,Stack 应该是 LIFO 而 Queue 应该是 FIFO 并注意我使用的 SHOULD,因为只有实现才能确定真正的行为。

无论如何,这真的取决于。

于 2012-11-29T11:02:04.603 回答