gpt4 book ai didi

java - API java 5 及更多 : should I return an array or a Collection?

转载 作者:IT老高 更新时间:2023-10-28 21:02:53 24 4
gpt4 key购买 nike

本着 Best Practices: Always return a ____, never a ____ 的精神,我在即将发布的 migration from JDK1.4.2 to JDK5 and more 中遇到了类似的问题. (是的,我知道JDK1.4.2 is EOL! ;-))。

对于返回集合的函数(不是简单的 property collections ),我总是更喜欢(在 JDK1.4.2 中)返回 Array 而不是泛型 List,因为:

  • 它强制返回类型(MyObject[] 而不是对象列表,更多的是 type-safe 在静态 - 如在“编译” - 级别)
  • 建议在返回的集合中添加一个“只读”字符(将元素添加到集合中会更复杂,尽管这不像“只读”那样严格c# 中的关键字)。这与说它是“不可变的”不同,因为数组中的引用仍然可以修改...

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

现在,在 JDK5 及更高版本中,我可以使用 List<MyObject>如果我想。

选择返回MyObject[]的好理由有哪些?而不是列表或 Collection<MyObject>在 java5 中编码时?

奖金,如果 Collection<MyObject>使用,是否可以:

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

PS:JavaGenericFAQ没有那个。

最佳答案

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

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

使用 Collections.unmodifiableCollection (和类似的方法),您将获得只读约束(您无法通过数组实现 - 您必须返回数组的克隆)。

你不能强制成员的不变性,但是你也不能用数组来做到这一点。

关于java - API java 5 及更多 : should I return an array or a Collection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/225572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com