本着最佳实践的精神:始终返回a。(是的,我知道,JDK1.4.2是EOL!;-)
对于返回集合(不是简单的属性集合)的函数,我总是更喜欢(在JDK1.4.2中)返回数组而不是泛型列表,因为:
- 它强制执行返回类型(
MyObject[],而不是对象列表,更重要的是在静态上执行类型安全,如在“编译”级别) - 它建议在返回的集合中使用一个“只读”字符(向集合中添加元素要复杂得多,尽管这不如c#中的“只读”关键字严格)。这与说它是“不可变”不同,因为数组中的引用仍然可以修改
当然,我总是创建这个返回的数组(我不公开任何“内部”数组)
现在,在JDK5和更多版本中,我可以使用List<;MyObject>如果我想的话
选择返回MyObject[]而不是列表或Collection<;MyObject>在java5中编码时?
奖金,如果Collection<;MyObject>时,是否可以:
- 是否对返回的集合强制执行只读属性?(无
add()或remove()可能) - 对返回的集合强制一个不可变的方面?(即使该集合的引用也无法修改)
PS:JavaGenericFAQ中并没有这样的问题
与数组相比,更喜欢集合(或列表,或根据需要设置)。使用泛型,您可以获得Java 5之前所缺乏的类型检查。此外,通过仅公开接口,您可以在以后自由更改实现(例如,将ArrayList切换为LinkedList)
数组和泛型不能很好地混合。因此,如果你想利用泛型,你应该通常避免数组。
也就是说:你不能一般地创建一个数组。例如,如果T是泛型类型,则“新T[0]”不会编译。您必须执行类似于“(T[])new Object[0]”的操作,这将生成未经检查的强制转换警告。出于同样的原因,您不能在没有警告的情况下对varargs使用泛型类型
使用Collections.unmodifiableCollection(和类似的方法)可以获得只读约束(这是数组无法实现的,您必须返回数组的克隆)
您不能强制成员的不变性,但在数组中也不能这样做