我正在学习Java中的接口,他们给出的一个例子是能够使用List接口创建链表List<String> strings = new LinkedList<>();
但他们没有详细介绍。我为什么要这样做,反对LinkedList<String> strings = new LinkedList<>();
?
List<T>
是一个接口,这意味着在扩展List
时必须实现一定数量的方法。LinkedList
恰好延长了List
.当你做List<String> strings = new LinkedList<>();
时,java只能看到List
的方法。但是,当您这样做时LinkedList<String> strings = new LinkedList<>();
java将其视为LinkedList
并且当您调用LinkedList
具有getLast
的方法时,它将起作用。人们List<String> strings = new LinkedList<>();
主要是为了可读性,但它应该大致相同。
对于局部变量,这并不重要,至少在这种情况下不是这样。
List<String> strings = new LinkedList<>();
的主要好处是,如果需要,您可以简单地将 LinkedList 换成 ArrayList 或任何其他 List 实现。
这在类的"边缘"(参数、返回类型、字段)最为重要,因为它使您的 API 更加灵活,原因有两个:
- 其他类不受您选择的 List 实现的约束,因为您的类将采用任何 List
- 与您的类交互的其他类强制不知道您的类内部选择使用哪个 List 实现,这意味着您可以随时从 ArrayList 切换到 LinkedList,反之亦然,而不会破坏类之外的代码。
摘自Effective Java, 3rd Edition, Item 64:通过接口引用对象
如果您养成了使用接口作为类型的习惯,那么您的程序 会更加灵活。如果您决定要切换 实现时,您所要做的就是更改 构造函数(或使用不同的静态工厂)。
因此,使用List<String> strings = new LinkedList<>();
,您只需更改实现名称,其余的客户端代码保持不变。
使用LinkedList<String> strings = new LinkedList<>();
时,您可能需要修改客户端代码。
请注意,将实现类作为类型是完全合适的。但是,如果您可以使用接口作为类型,这是最佳选择。