Java 7 API设计最佳实践 - 返回Array或返回Collection

时间:2012-11-29 10:47:03

标签: java collections

我知道在通用发布之前会问这个问题。在Array强制执行返回类型的情况下,Array确实胜出一点,它更加类型安全。

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

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

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

我脑子里没有特殊情况,我更多的是寻找一般的利弊比较。

5 个答案:

答案 0 :(得分:13)

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

如果您正在编写此内容供自己使用,最佳做法是从集合类型开始,只有在涉及它的确定性能问题时才切换到数组。

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

答案 1 :(得分:9)

这是部分列表

数组的优点:

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

列表的优点:

  • 行为因返回的实际类型而异(例如 - 根据实际类型可以是可变的或不可变的)
  • 更好的雇佣设计
  • (取决于实际类型)可能是动态尺寸
  • 更直观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 :)
    

答案 2 :(得分:3)

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

实施接口

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

添加行为

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

  1. 同步集合
  2. 使集合不可变
  3. 搜索,倒车等......

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

如果返回的值将被迭代而没有其他内容,则数组是最佳选择,但如果结果将被操作,则转到相应的Collection。

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

无论如何,这实际上取决于。