可能重复:
Why should the interface for a Java class be prefered?
我是java的新手,我刚开始使用集合框架。
在ArrayList
上,我在两个方面遇到了人们宣称它。例如,声明ArrayList
的{{1}}:
String
或
List<String> l = new ArrayList<String>();
我应该使用这两者中的哪一个,它们之间有什么区别?
我知道调用的实际方法是在运行时决定的,因此调用的方法都只有ArrayList<String> al = new ArrayList<String>();
类,但第一个声明仍然限制了可以调用的方法。
第一种方式是,我听过,称为#34;编码到界面&#34;。任何方法都将使用变量ArrayList
调用,因此只能调用l
接口提供的方法,而在第二个示例中,我们不仅可以调用List
提供的所有方法但也可以List
类(如Object
,finalize()
等)。那么为什么即使在第一时间人们甚至使用第一个宣言?
答案 0 :(得分:4)
您应始终使用最少的特定界面。如果存在更合适的实现,则可以更容易地替换替代实现。例如,如果列表是链表或数组列表,则List
的方法不关心。您可以选择哪一个更合适。
答案 1 :(得分:2)
我个人建议使用List<String> l = new ArrayList<String>();
原因是您通常不需要知道您正在使用ArrayList。你只需要像列表那样运作的东西。人们不需要访问的ArrayList上有很多行为。考虑“EnsureCapacity”。他们不需要 - 他们只需要List操作。作为一般规则,您希望在“需要知道”的基础上限制数据和功能的暴露,并且列表的用户不需要知道(默认情况下)您使用的实现。
显然,如果他们确实需要知道您正在使用ArrayList而不是LinkedList,那么您可能希望使用ArrayList引用而不是List引用。但是,对于大多数目的而言,这不是必需的。