0

可能重复:
为什么要首选 Java 类的接口?

我对 java 比较陌生,我刚刚开始使用集合框架。虽然ArrayList我遇到了人们声明它的两种方式。例如声明一个ArrayListof Strings :

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

或者

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

我应该使用这两者中的哪一个,它们之间有什么区别?

我知道调用的实际方法是在运行时决定的,因此调用的方法都只是ArrayList类的,但第一个声明仍然限制了可以调用的方法。

第一种方法,我听说,称为“对接口进行编码”。任何方法都将使用该变量调用l,因此只能调用List接口提供的方法,而在第二个示例中,我们不仅可以调用类提供的所有方法,还可以调用List类提供的所有方法Object(例如finalize()wait()等)。那么为什么甚至首先人们甚至使用第一个声明?

4

2 回答 2

4

您应该始终尽可能使用最少的特定接口。如果存在更合适的实现,这使得替换替代实现变得更容易。例如,方法List不关心列表是链表还是数组列表。您可以选择更合适的一个。

于 2012-06-12T15:01:17.250 回答
2

我个人推荐使用List<String> l = new ArrayList<String>();

原因是您通常不需要知道您正在使用 ArrayList。您只需要像列表一样运行的东西。ArrayList 上有很多人们不需要访问的行为。考虑“确保容量”。他们不需要那个 - 他们只需要 List 操作。作为一般规则,您希望在“需要知道”的基础上限制数据和功能的公开,并且您列表的用户不需要知道(默认情况下)您使用了什么实现。

显然,例如,如果他们确实需要知道您使用的是 ArrayList 而不是 LinkedList,那么您可能希望使用 ArrayList 引用而不是 List 引用。但是,对于大多数目的来说,这不是必需的。

于 2012-06-12T15:02:28.923 回答