Return ArrayList or List?



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

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

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

我说得对吗?

返回List将使库的用户可以使用任何实现List接口的东西,而使用ArrayListrrayList

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

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

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

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

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

List myList = new MyLibrary().getList();
ArrayList myArrayList = new ArrayList(myList);
LinkedList myLinkedList = new LinkedList(myList);

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

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

1。这是Interface Polymorphism的概念。

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

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

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

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

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

使用更通用的类型也为您在未来提供了更多的操作空间。也许您的方法将从流源而不是内存源加载数据:那么Iterable将变得比List更合适。

相关内容

最新更新