本着最佳实践:始终返回 ____,从不返回 ____ https://stackoverflow.com/questions/171156/best-practices-always-return-a-never-a,我在即将到来的文章中面临类似的问题从 JDK1.4.2 迁移到 JDK5 等 https://stackoverflow.com/questions/219164/generics-in-legacy-code。 (是的,我know, JDK1.4.2 已停产! http://java.sun.com/products/archive/eol.policy.html ;-) ).
对于返回集合的函数(这并不简单财产收藏 https://stackoverflow.com/questions/35007/how-to-expose-a-collection-property),我总是更喜欢(在 JDK1.4.2 中)返回 Array 而不是泛型 List,因为:
- 它强制返回类型(
MyObject[]
而不是对象列表,还有更多类型安全在静态(如“编译”级别)
- it suggests返回集合的“只读”字符(将元素添加到集合中更为复杂,尽管这不像 C# 中的“只读”关键字那么严格)。这与说它是“不可变的”不同,因为数组内的引用仍然可以修改......
当然,我总是create返回的数组(我不公开任何“内部”数组)
现在,在 JDK5 及更高版本中,我可以使用List<MyObject>
如果我想。
选择回国的充分理由有哪些MyObject[]
而不是列表或Collection<MyObject>
当用java5编码时?
奖金,如果Collection<MyObject>
使用时,是否可以:
- 对返回的集合强制执行只读属性? (不
add()
or remove()
可能的)
- 对返回的集合强制执行不可变的方面? (即使该集合的引用也无法修改)
PS: The Java通用常见问题解答 http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html不太有那个。
优先选择 Collection(或 List,或 Set,视情况而定)而不是数组。使用泛型,您可以获得 Java 5 之前所缺少的类型检查。此外,通过仅公开接口,您可以在以后随意更改实现(例如,将 ArrayList 切换为 LinkedList)。
数组和泛型不能很好地混合。所以,如果你想利用泛型,你应该usually避免数组。
即:您通常不能创建数组。例如,如果 T 是泛型类型,则“new T[0]”无法编译。您必须执行类似“(T[]) new Object[0]”的操作,这会生成未经检查的强制转换警告。出于同样的原因,您不能在没有警告的情况下将泛型类型与可变参数一起使用。
Using Collections.unmodifierCollection http://java.sun.com/javase/6/docs/api/java/util/Collections.html#unmodifiableCollection(java.util.Collection)(和类似的方法),您将获得只读约束(这是无法使用数组实现的 - 您必须返回数组的克隆)。
您无法强制成员的不变性,但也无法使用数组来做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)