13

我正在创建一个供人们使用的库,但为什么我的方法应该返回List而不是ArrayList

因为如果用户知道真正的类型是ArrayList,他将在循环中使用访问器 [] 而不是迭代器,但如果他不知道,他将使用迭代器。

LinkedList同样的问题,如果返回类型是 List 他将无法使用正确的访问器。

我对吗?

4

8 回答 8

21

返回List将使您的库的用户可以使用任何实现List接口的东西,而使用ArrayList将迫使他们使用ArrayList

如果将来您作为库创建者决定更改您的内部实现,那么这些更改将通过您库的通用接口对最终用户隐藏。

于 2012-07-27T07:13:52.863 回答
8

因为您库的用户永远不应该知道您在内部使用 ArrayList。

例如,假设您返回一个 ArrayList 并且很多人已经开始使用您的库。现在,如果您突然意识到 LinkedList 更适合您的目的,那么您就破坏了所有当前使用您的代码的人的兼容性。

这就是为什么编写接口而不是实现总是更好的原因,当您编写专门用于重用的代码时更是如此。接口(在本例中为 List)充当您的代码和客户端代码之间的契约。它告诉他们你的代码做了什么(接口),而不告诉他们它是怎么做的(通过不公开实现)。

于 2012-07-27T07:17:43.717 回答
5

如果可能,返回一个接口(或失败的超类?)。这样,如果被覆盖,该方法可以具有更广泛的应用。这可能会阻止某些特定于类的方法在返回的对象上可用,但没有什么能阻止程序员获取List数据并将其复制到Collection他们喜欢使用的任何地方。

List myList = new MyLibrary().getList();

ArrayList myArrayList = new ArrayList(myList);
LinkedList myLinkedList = new LinkedList(myList);
于 2012-07-27T07:17:13.543 回答
1

1.它的概念Interface Polymorphism

2.最好有List<My_Obj> arr = new ArrayList<My_Obj>;

3.假设你想使用LinkedList而不是ArrayList作为某个点,那么你不需要担心如何去做。

于 2012-07-27T07:24:25.620 回答
1

如果您要返回 List,那么您的库的用户可以使用任何实现 List 接口的东西。它可能是数组列表或链表。

于 2012-07-27T07:28:08.020 回答
1

因为您的用户可以从您的列表中选择ArrayListLinkedList,所以您将给他一个选择。它被称为接口编程。你应该给你的 API 用户尽可能多的自由,而这种技术是实现它的方法之一。

于 2012-07-27T07:15:04.173 回答
1

他们不必使用迭代器 - List 接口支持get(int index)作为一种方法。如果您希望灵活地将底层容器更改为支持列表接口的任何内容,请使用List. 如果返回的内容需要特定ArrayList方法,请使用ArrayList.

于 2012-07-27T07:15:39.440 回答
1

我通常会选择最通用的类​​型。在这种情况下,您可以返回比 List 更通用的类型,例如Collectionor Iterable

通过返回 Iterable,编译器将阻止调用代码尝试将元素添加到您的列表中。这比依靠Collections.unmodifiableList()在运行时失败要强大得多。

使用更通用的类型也为您在未来提供了更多的回旋余地。也许您的方法会从流式源而不是内存中的源加载数据:那么 Iterable 变得比 List 更合适。

于 2012-07-31T22:23:46.383 回答