API java 5及更多:我应该返回数组还是集合?

本着最佳实践的精神:始终返回a。(是的,我知道,JDK1.4.2是EOL!;-)

对于返回集合(不是简单的属性集合)的函数,我总是更喜欢(在JDK1.4.2中)返回数组而不是泛型列表,因为:

  • 它强制执行返回类型(MyObject[],而不是对象列表,更重要的是在静态上执行类型安全,如在“编译”级别)
  • 建议在返回的集合中使用一个“只读”字符(向集合中添加元素要复杂得多,尽管这不如c#中的“只读”关键字严格)。这与说它是“不可变”不同,因为数组中的引用仍然可以修改

当然,我总是创建这个返回的数组(我不公开任何“内部”数组)

现在,在JDK5和更多版本中,我可以使用List<MyObject&gt如果我想的话

选择返回MyObject[]而不是列表或Collection<MyObject&gt在java5中编码时?

奖金,如果Collection<MyObject&gt时,是否可以:

  • 是否对返回的集合强制执行只读属性?(无add()remove()可能)
  • 对返回的集合强制一个不可变的方面?(即使该集合的引用也无法修改)

PS:JavaGenericFAQ中并没有这样的问题

与数组相比,更喜欢集合(或列表,或根据需要设置)。使用泛型,您可以获得Java 5之前所缺乏的类型检查。此外,通过仅公开接口,您可以在以后自由更改实现(例如,将ArrayList切换为LinkedList)

数组和泛型不能很好地混合。因此,如果你想利用泛型,你应该通常避免数组。
也就是说:你不能一般地创建一个数组。例如,如果T是泛型类型,则“新T[0]”不会编译。您必须执行类似于“(T[])new Object[0]”的操作,这将生成未经检查的强制转换警告。出于同样的原因,您不能在没有警告的情况下对varargs使用泛型类型

使用Collections.unmodifiableCollection(和类似的方法)可以获得只读约束(这是数组无法实现的,您必须返回数组的克隆)

您不能强制成员的不变性,但在数组中也不能这样做

发表评论