是否可以返回unmodifiableList或者我应该返回数组?

时间:2010-02-02 17:08:55

标签: java oop collections api-design

我有方法List<Foo> getFoos (),它从远程服务器获取数据并返回它。

当然,用户不应该更改列表中的项目数,因为他将获得与服务器上的数据不同步的数据(如果他想要更改项目数量,他有特殊方法,如addFoo ()) 。

第一种方法是返回数组并将方法的签名更改为Foo[] getFoos ()。但它在java中更常见,用户使用集合操作更方便,因此我将签名更改为List<Foo> getFoos ()。此方法始终返回

Collections.unmodifiableList (originalList)

因此,当用户尝试更改列表时,他将获得RuntimeException。

在类似情况下是否有关于api设计的建议?

5 个答案:

答案 0 :(得分:25)

Collections.unmodifiableList是完全可以接受的,应该更快(不需要创建数组)。

编辑 - 在API设计方面,您应该清楚地了解JavaDoc!使用方法而不阅读其文档的人应该得到惊喜:p

答案 1 :(得分:2)

我还说它完全可以接受并且比返回一个数组要好得多(some建议应该将其视为一个弃用的类型)。如果您想在API中更明确地说明它,可以考虑从Google Collections返回ImmutableList

答案 2 :(得分:1)

我几乎从未返回裸列表或数组。如果你有一些东西的集合,它几乎总是有一些与它相关联的代码应该是该集合的一部分。如果没有围绕集合的类,则强制自己在使用集合的不同位置复制该代码。

通常还有一个或两个与集合相关联的变量。你会发现每当你通过这个集合时都会传递它们。这些属于包装集合的业务逻辑类。

答案 3 :(得分:0)

如果你想要一个现有对象的自定义,专用属性,或者在这种情况下为什么不尝试扩展或包含它,并使相关的访问器抛出异常?

原因是您可能希望允许其他一些客户端对象修改列表;它取决于返回数据与应用程序级别的接近程度。

答案 4 :(得分:0)

如果你有完全的自由而且看起来如此,那么你不必在数组或List之间做出选择,而是返回迭代器。如果你需要唯一性,这也会有所帮助,而不是返回Set - 仍然返回迭代器。