我将这两个语句用于ArrayList定义:
ArrayList<String> my = new ArrayList<>();
List<String> my2 = new ArrayList<>();
我应该使用哪一个?
答案 0 :(得分:3)
使用第二个定义,您可以稍后将ArrayList构造函数替换为另一种类型的List,例如LinkedList或高性能列表,或将来可能存在的任何其他类型的列表。在第一个定义中,您将永远与ArrayList实现绑定。您无法更改它,因为您的其余代码信任此引用显式为ArrayList。
相反,通过使用接口,您的代码依赖于接口的契约,而不是特定实现(如ArrayList)。这使您能够在不影响其用户的情况下更改实现。改变是我们必须培养和提前计划的事情,因为我们无法防止事情发生变化。
答案 1 :(得分:1)
后者。编程到接口,而不是实现。
答案 2 :(得分:1)
取决于您的需求。如果可能的话,通常建议使用接口(因此使用List),否则你会坚持使用实现类。比如说,你使用ArrayList作为某种方法的输入参数。出于某种原因(例如性能),您决定在某些时候从ArrayList切换到LinkedList。因此,您还必须更改输入参数的类型。如果使用interface(List),则可以更自由地切换实现,而无需重构代码。