我正在创建一个供人们使用的库,但为什么我的方法会返回列表而不是 ArrayList ?
因为如果用户知道真实类型是 ArrayList ,他将在循环中使用accessor []而不是迭代器,但如果他不知道他将使用迭代器。
LinkedList 的相同问题,如果返回类型是List,则他将无法使用正确的访问者。
我是对的吗?
答案 0 :(得分:20)
返回列表将使您图书馆的用户可以使用任何实现列表界面的内容,而使用 ArrayList 会强制他们使用 ArrayList 。
如果您将来作为图书馆创建者决定更改内部实施,那么您的图书馆通用界面将隐藏最终用户的更改。
答案 1 :(得分:8)
因为您的库的用户永远不会知道您在内部使用ArrayList。
例如,假设您返回一个ArrayList,很多人已经开始使用您的库。现在,如果您突然意识到LinkedList更适合您的目的,那么您将破坏目前使用您的代码的所有人的兼容性。
这就是编写接口而不是实现的代码总是更好的原因,当您编写专门用于重用的代码时更是如此。接口(在本例中为List)充当代码与客户端代码之间的契约。它告诉他们你的代码做什么(接口),而不告诉他们 它是如何做到的(通过不暴露实现)。
答案 2 :(得分:5)
如果可能的话,返回一个接口(或者超类失败?)。这样,如果覆盖,该方法可以具有更广泛的应用。这可能会阻止某些特定于类的方法在返回的对象上可用,但是没有什么能阻止程序员获取List
数据并将其复制到他们更喜欢使用的Collection
。
List myList = new MyLibrary().getList();
ArrayList myArrayList = new ArrayList(myList);
LinkedList myLinkedList = new LinkedList(myList);
答案 3 :(得分:1)
由于您的用户可以从您的列表ArrayList
或LinkedList
进行制作,因此您可以选择。它被称为Programming to Interface。您应该尽可能多地为API用户提供自由,这种技术是实现它的方法之一。
答案 4 :(得分:1)
它们不必使用迭代器 - List接口支持get(int index)
作为方法。如果您希望灵活地将基础容器更改为支持列表界面的任何内容,请使用List
。如果您返回的内容需要特定的ArrayList
方法,请使用ArrayList
。
答案 5 :(得分:1)
1。其概念为Interface Polymorphism
。
2。最好有List<My_Obj> arr = new ArrayList<My_Obj>;
3. 假设您想使用 LinkedList而不是ArrayList作为某个点,那么你不要 需要担心怎么做..
答案 6 :(得分:1)
如果您要返回List,则库的用户可以使用实现List接口的任何内容。它可能是数组列表或链接列表。
答案 7 :(得分:1)
我通常会选择最常用的类型。在这种情况下,您可以返回比列表更通用的类型,例如Collection
或Iterable
。
通过返回Iterable,编译器将阻止调用代码尝试向列表中添加元素。这比依赖Collections.unmodifiableList()
在运行时失败要强得多。
使用更一般的类型还可以为您提供更多的回旋余地。也许你的方法将从流式源而不是内存源加载数据:然后Iterable变得比List更合适。