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

She*_*jie 13 java collections

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

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

public String[] getElements(String type)
vs
public List<String> getElements(String type)
Run Code Online (Sandbox Code Playgroud)

我总是在努力想出一些很好的理由来回归一个阵列或者其他方式.在选择String []或List作为API的返回类型时,最佳做法是什么?或者它是马的课程.

我脑子里没有特殊情况,我更希望找到一个通用的利弊比较.

Mar*_*nik 14

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

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

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


ami*_*mit 10

这是部分清单

阵列的优点:

  • 快速
  • 本质上是可变的
  • 你确切地知道"你得到了什么"(类型是什么) - 所以你确切地知道返回的对象将如何表现.

列表的优点:

  • 行为取决于返回的实际类型(例如 - 可以是可变的或不可变的,具体取决于实际类型)
  • 更好的雇佣设计
  • (取决于实际类型)可能是动态大小
  • 更直观- 如果将基于散列的集合作为关键字输入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 :)
    
    Run Code Online (Sandbox Code Playgroud)

  • 请注意,由于数组类型的协方差,它们并不是非常类型安全的.声明`void setFirst(Object [] xs,Object x);`并调用`setFirst(new Integer [2],"a")`,编译. (2认同)