19

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

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

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

Collections.unmodifiableList (originalList)

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

类似情况下有没有关于api设计的推荐?

4

5 回答 5

25

Collections.unmodifiableList完全可以接受并且应该更快(无需创建数组)。

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

于 2010-02-02T17:14:17.920 回答
2

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

于 2010-02-02T17:20:39.323 回答
1

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

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

于 2010-02-02T17:32:17.680 回答
0

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

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

于 2010-02-02T17:16:10.517 回答
0

如果您拥有完全的自由并且看起来确实如此,那么您不必在数组或列表之间进行选择,而是返回一个迭代器。如果您需要唯一性,这也将有所帮助,而不是返回 Set - 仍然返回迭代器。

于 2010-03-08T20:42:31.070 回答