以下是如何创建ArrayList
的两种方式:
List<String/*or other object*/> arrList = new ArrayList();//Imports List, ArrayList
ArrayList<String/*or other object*/> arrList = new ArrayList();//Imports just ArrayList
有什么区别?应该使用哪种方法?
答案 0 :(得分:6)
第一种形式建议用于类的公共接口(例如,类中属性的声明)。这是一个众所周知的建议,你应该为一个接口编程,而不是一个具体的实现(这在Design Patterns中说明) - 你必须导入的类的数量与代码的质量和良好关系不大设计。
第一种形式的优点是,如果需要的话,它将允许您稍后轻松交换实现 - 而第二种实现方式与实现类相结合,使您的代码更难以发展并且不那么灵活。 / p>
有些情况下可以声明和使用具体的类,但是(例如,性能稍微提高)。但是类的公共接口应尽可能使用接口,这将使未来的更改更容易实现。
答案 1 :(得分:2)
第一种方式称为编码接口
第二个被称为编码实现。
第二个优点是它可以让您灵活地在以后更改实现类,而无需更改任何代码。例如,今天您使用的是ArrayList
,但如果明天要将其更改为LinkedList
,则只需更改列表定义中的实现类。
答案 2 :(得分:1)
通过像第一个示例一样,您可以将List分配给实现List
接口的任何数据结构。
这会为您的程序添加flexibility
,因为您可以轻松更改实施。
答案 3 :(得分:1)
如果您后来意识到List的另一个实现更适合您的任务,那么第一个让您可以自由地更改具体类(ArrayList)。您只需要更改那一行,因为使用arrList
的其他地方需要实现List的任何内容,而不是ArrayList
。
对于第二个版本,如果您决定进行更改,则必须更改所有需要ArrayList.
如上所述,这称为接口编码。
答案 4 :(得分:0)
列表是一个界面。 ArrayList是一个实现List接口的类。
答案 5 :(得分:0)
不同之处在于它隐藏了返回List的方法的调用者的具体实现。这通常是一种很好的做法 - 如果您返回List
,那么您可以自由地稍后更改底层实现,而不必担心更改一堆其他代码会产生连锁反应。如果您不需要像List.get(index)
这样的特定于列表的内容,您甚至可以更进一步,只需指定Collection<String> col = new ArrayList<String();
答案 6 :(得分:0)
如果您想创建ArrayList
,只有第二个是正确的。第一个创建List
,由ArrayList
类实现,但在许多情况下它们不可互换。 This question有一个很好的答案。
答案 7 :(得分:0)
与流行的观点相反,我说我们应该使用第二种形式
ArrayList<X> list = new ArrayList<>();
这一行是一个实现细节;我们应该在实施细节中尽可能具体。
它不是应该被抽象的公共API的一部分; &#34;针对接口的代码的参数&#34;不适用于此。
答案 8 :(得分:0)
我可以看到很多人建议使用界面,我会说以下内容:
如果您认为使用您的代码的人确实需要知道您正在使用的实现的详细信息,请使用具体的类。例如,如果您正在编写一个高性能库,该库具有返回特定实现的方法,例如LinkedList,在处理时需要特别小心。)
在大多数其他情况下,当您可以避免暴露太多细节时,请使用接口。