collection vs list vs arrays作为EJB方法的返回类型

Kir*_*han 10 java collections ejb java-ee

我最近被告知,集合应该优先于List作为EJB方法的返回值.这个论点是,通常集合更通用,即允许您在不影响客户端的情况下更改基础数据结构.如果这是您希望作为设计师的灵活性,那么使用集合将更有意义.但是,返回一个数组而不是集合会不会更有意义?

什么是性能影响,如果有的话?

提前致谢.

Boz*_*zho 29

  • 首选集合而不是数组; 使用泛型
  • 使用接口而不是具体类

然后,你通常有4个选项:List,Set, CollectionIterable.它取决于你想要包含的语义.

  • 如果它是内部API - 根据集合的特征决定它:
    • 它只保留独特的物品吗? Set
    • 客户是否需要随机访问它? List
    • 客户需要修改它(添加,删除)(没有上述两个特征)? Collection
    • 客户只需要迭代它吗? Iterable
  • 如果它是一个Web服务并不重要 - 它以相同的方式序列化.

(注:也有更具体的语义一些集合接口:Queue,Deque,Map,Bag,Multiset,等等-但它会是相当明显的,当你需要返回它们)

  • 另请注意,`Collection`有一个`size()`方法,而`Iterable`没有,并且不值得限制客户端迭代`Iterable`只是为了获得大小.所以我的补充是:"客户需要修改它吗?或者很可能需要它的大小`". (2认同)

Pét*_*rök 5

一般而言,集合优于数组,尤其是Java5之后,它们被转换为通用集合.这为您提供了类型安全性,以及许多在数组中不可用的潜在额外功能(例如,设置/队列等行为) - 这些功能实际上根本无法与数组直接比较.在集合中,ArrayList是数组的直接类比,并且 - 在数组之上实现 - 其性能可与本机数组相媲美.

至于Collection vs List(或其他一些更具体的界面),我个人更喜欢更具体的界面,因为例如List vs a Set的特征和行为是非常不同的.在设计良好的界面中,您应该事先知道(并指定)是否返回例如Set,Dequeue或List.如果你返回一个Collection,你的所有客户端都可以做(除了添加/删除元素之外)迭代它,这对他们来说可能是不够的.

  • 我同意第一段.我不认为第二个作为一般规则是有意义的.它实际上取决于收集对调用者意味着什么.如果返回List,则可能意味着返回的数据具有某种顺序.如果这就是你想要表达的伟大.否则,我更喜欢收藏.如果数据是唯一的,那么你应该使用Set.然后再次,如果它已排序,您可能需要SortedSet.换句话说,您应该根据要传达给调用者的约束来选择接口. (2认同)