返回ArrayList或List?

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

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

对于LinkedList的相同问题,如果返回类型是List,则他将无法使用正确的访问者。

我对吗?

返回List将使您的库的用户可以使用实现List接口的任何内容,而使用ArrayList将强制他们使用ArrayList

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

因为您的库的用户永远不会知道您在内部使用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

因为您的用户可以从List中创建ArrayListLinkedList ,所以您可以选择。 它被称为编程接口 。 您应该尽可能多地为API用户提供自由,这种技术是实现它的方法之一。

它是Interface Polymorphism的概念。

2.最好有List arr = new ArrayList;

3.假设您想使用LinkedList而不是ArrayList作为某个点,那么您不必担心如何执行它。

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

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

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

使用更一般的类型还可以为您提供更多的未来操作空间。 也许你的方法是从流源而不是内存源加载你的数据:然后Iterable变得比List更合适。