我有方法List<Foo> getFoos ()
,它从远程服务器获取数据并返回它。
当然,用户不应该更改列表中的项目数,因为他将获得与服务器上的数据不同步的数据(如果他想要更改项目数量,他有特殊方法,如addFoo ()
) 。
第一种方法是返回数组并将方法的签名更改为Foo[] getFoos ()
。但它在java中更常见,用户使用集合操作更方便,因此我将签名更改为List<Foo> getFoos ()
。此方法始终返回
Collections.unmodifiableList (originalList)
因此,当用户尝试更改列表时,他将获得RuntimeException。
在类似情况下是否有关于api设计的建议?
答案 0 :(得分:25)
Collections.unmodifiableList
是完全可以接受的,应该更快(不需要创建数组)。
编辑 - 在API设计方面,您应该清楚地了解JavaDoc!使用方法而不阅读其文档的人应该得到惊喜:p
答案 1 :(得分:2)
我还说它完全可以接受并且比返回一个数组要好得多(some建议应该将其视为一个弃用的类型)。如果您想在API中更明确地说明它,可以考虑从Google Collections返回ImmutableList
。
答案 2 :(得分:1)
我几乎从未返回裸列表或数组。如果你有一些东西的集合,它几乎总是有一些与它相关联的代码应该是该集合的一部分。如果没有围绕集合的类,则强制自己在使用集合的不同位置复制该代码。
通常还有一个或两个与集合相关联的变量。你会发现每当你通过这个集合时都会传递它们。这些属于包装集合的业务逻辑类。
答案 3 :(得分:0)
如果你想要一个现有对象的自定义,专用属性,或者在这种情况下为什么不尝试扩展或包含它,并使相关的访问器抛出异常?
原因是您可能希望允许其他一些客户端对象修改列表;它取决于返回数据与应用程序级别的接近程度。
答案 4 :(得分:0)
如果你有完全的自由而且看起来如此,那么你不必在数组或List之间做出选择,而是返回迭代器。如果你需要唯一性,这也会有所帮助,而不是返回Set - 仍然返回迭代器。