这是一个真正的初学者的问题(我还在学习的Java基础)。
(那种),我可以理解为什么的方法将返回一个List <String>的,而不是一个ArrayList <String>的,为什么他们会接受一个列表参数,而不是一个ArrayList。 如果它使该方法没有什么区别(即,如果从ArrayList中没有特殊的方法是必需的),这将使得该方法更灵活,更容易地使用呼叫者。 同样的事情也适用于其他集合类型,如设置或地图。
我不明白:这似乎是常见的做法是创建本地变量是这样的:
List<String> list = new ArrayList<String>();
虽然这种形式是不太频繁:
ArrayList<String> list = new ArrayList<String>();
这里有什么优势?
所有我能看到的是一个小的不足:对java.util.List的一个单独的“进口”线路已被添加。 从技术上讲,“进口的java.util。*”可以使用,但我没有看到,很多时候要么,可能是因为“进口”线由一些IDE自动添加。
当你阅读
List<String> list = new ArrayList<String>();
你的想法,所有你关心的是作为一个List<String>
,你把实际执行不太重视。 此外,你限制自己的声明成员List<String>
,而不是具体的实现。 如果您的数据存储的线性阵列或一些奇特的数据结构,只要它看起来像一个你不喜欢List<String>
。
在另一方面,读出第二行给出您的代码关心变量为主意ArrayList<String>
。 通过写这个,你说隐(到未来的读者),你不应该盲目地改变实际的对象类型,因为代码的其余部分依赖于事实,这确实是一个ArrayList<String>
。
使用界面,您可以快速更改列表/地图/设置/等底层实现。
这不是拯救按键,它是关于快速变化的实现。 理想情况下,你不应该暴露的执行标的具体方法,只是使用所需的接口。
我建议来自各地的另一端想着这个。 通常你想有一个列表或一组或任何其他类型的集合 - 你真的不要在您的代码关心这究竟是如何实现的。 因此,你的代码只是工作用表,做任何需要做的(也表述为“永远的代码接口”)。
当您创建列表,你需要决定你想要什么实际执行。 在大多数情况下的ArrayList是“足够好”,但你的代码真的不在乎。 通过坚持使用的界面,你传达这个未来的读者。
比如我有具有其中转储系统属性到System.out我的主要方法调试代码的习惯 - 它通常是更漂亮,让他们有序。 最简单的方法是简单地让“地图=新TreeMap的(属性);” 然后遍历它们,如TreeMap的返回排序的键。
当您了解更多关于Java,你还会看到,接口测试和嘲弄非常有帮助的,因为你可以创建在运行时符合给定的接口指定行为的对象。 一种先进的(但简单)例如可以在可见http://www.exampledepot.com/egs/java.lang.reflect/ProxyClass.html
如果以后要更改执行的列表,并使用例如LinkedList的(也许有更好的表现),你没有改变整个代码(API如果库)。 如果顺序并不重要,你应该这样以后返回Collection的,你可以很容易地更改设置,如果你需要进行排序的项目。
我能想出的(因为我在Java中没有程序尽可能频繁地在其他语言)的最好解释是,它更容易改变“后端”列表类型,同时保持相同的代码/接口一切是依靠。 如果你首先声明它作为一个更具体的类型,然后再决定你想要一个不同类型的...如果事情发生在使用特定的ArrayList法,这是额外的工作。
当然,如果你确实需要特定的ArrayList行为,你会与特定的变量类型,而不是去。
关键是要找出你想要的行为/需要,然后使用规定行为的接口。 该是你的变量类型。 然后,使用符合您的其他需求的实现 - 效率等,这是你与“新”的创造什么。 这种双重性的背后OOD的主要思路之一。 这个问题是不是当你正在处理局部变量尤其显著,但很少会伤害遵循良好的编码习惯所有的时间。
基本上,这是来自谁拥有经营大型项目,可能还有其他原因的人 - 你听到这一切的时候。 为什么,我真的不知道。 如果你需要一个数组列表或哈希表或哈希集合或其他任何我看到通过转换成一个接口排除方法是没有意义的。
让我们说,例如,最近我学会了如何使用和实施的HashSet为原则数据结构。 假设,无论出于何种原因,我到一个团队中工作。 那不是人需要知道数据是键控上散列的办法,而不是由一些基础被命令? 通过Twisol指出后端的做法在C / C工作++在那里你可以露出头部,因此销售出库,如果有人知道如何做到这一点在Java中我会想象他们会用JNI - 在这点似乎简单到我使用C / C ++,你可以露出头和建设使用既有的工具,用于这一目的的库。
到时候,你可以找人谁可以扩展安装JAR文件目录它似乎对我来说,实体可以是绝对小步走 - 我在扩展目录下降几个加密库,这是方便,但我真的想看到阐明清晰,简洁的基础。 我想他们这样做,所有的时间。
在这一点上的声音,我喜欢经典的混淆,但要注意:你有一些编码做面前的问题是后果。