可能重复:
List 与 ArrayList 作为引用类型?
我在 StackOverflow 的某处读到:
List<String> foo = new ArrayList<String>();
是初始化 ArrayList 的最佳实践。这就是:
ArrayList<String> foo = new ArrayList<String>();
应该避免。这个对吗?如果是的话,有人可以解释为什么会这样吗?
谢谢, EG
可能重复:
List 与 ArrayList 作为引用类型?
我在 StackOverflow 的某处读到:
List<String> foo = new ArrayList<String>();
是初始化 ArrayList 的最佳实践。这就是:
ArrayList<String> foo = new ArrayList<String>();
应该避免。这个对吗?如果是的话,有人可以解释为什么会这样吗?
谢谢, EG
这是大多数开发人员ArrayList
(包括我自己)的使用方式,也是多态性的一般原则。您应该尽可能使用类层次结构中的最高类/接口,同时仍然可以使用所有功能。
通常,这会使您的代码更加灵活,并且您可以更轻松地切换实现,因为您知道使用List
as 类型进行编程并没有限制您使用任何仅在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
。
是的,第一个可以灵活地在以后更改实施,而对客户端的更改最少。
例如,您可以更改ArrayList
为LinkedList
,但如果客户端使用接口方法,它将受到的影响最小。
List<String> tempList = new LinkedList<String>();
它被称为界面设计。如果您将 List 定义为参数,则您的代码将是灵活的,ArrayList 和 LinkedList(或任何其他实现接口 List)都可以用作底层实现。