0

可能重复:
List 与 ArrayList 作为引用类型?

我在 StackOverflow 的某处读到:

List<String> foo = new ArrayList<String>();

是初始化 ArrayList 的最佳实践。这就是:

ArrayList<String> foo = new ArrayList<String>();

应该避免。这个对吗?如果是的话,有人可以解释为什么会这样吗?

谢谢, EG

4

3 回答 3

1

这是大多数开发人员ArrayList(包括我自己)的使用方式,也是多态性的一般原则。您应该尽可能使用类层次结构中的最高类/接口,同时仍然可以使用所有功能。

通常,这会使您的代码更加灵活,并且您可以更轻松地切换实现,因为您知道使用Listas 类型进行编程并没有限制您使用任何仅在a 上ArrayList可用且不可用的方法LinkedList

例如,如果我这样做:

LinkedList<String> strings = new LinkedList<String>();
String s = strings.pop();

pop是专有的LinkedList,所以我不能直接将其更改为ArrayList. 我还必须更改我的代码:

ArrayList<String> strings = new ArrayList<String>();
String s = strings.remove(strings.size() - 1);

但如果我只是使用接口,我一开始就不会使用pop,所以我可以更改strings为我想要的任何实现。

这在编程 API 时尤其重要。如果您的方法可以公开访问并且将被其他开发人员使用,那么您需要确保您没有限制您的方法所采用的列表类型,除非您有充分的理由这样做,特别是因为它们可能具有良好的不想用的理由ArrayList

如果您除了迭代和添加/删除什么都不做,您甚至可以升级到Collection. 但是,在这里您开始失去上下文,因为List它告诉您它可能包含重复项并且是手动订购的。但是,如果这不是特别重要并且您可以使用Collection,您甚至可以将列表替换为 的实现Set

于 2012-10-10T14:07:59.433 回答
0

是的,第一个可以灵活地在以后更改实施,而对客户端的更改最少。

例如,您可以更改ArrayListLinkedList,但如果客户端使用接口方法,它将受到的影响最小。

List<String> tempList = new LinkedList<String>();
于 2012-10-10T14:06:42.403 回答
0

它被称为界面设计。如果您将 List 定义为参数,则您的代码将是灵活的,ArrayList 和 LinkedList(或任何其他实现接口 List)都可以用作底层实现。

于 2012-10-10T14:07:43.293 回答