Java 为什么返回迭代器低耦合(OOP)?

Java 为什么返回迭代器低耦合(OOP)?,java,oop,arraylist,iterator,loose-coupling,Java,Oop,Arraylist,Iterator,Loose Coupling,所以我今天听说返回迭代器是比返回arraylist更好的解决方案(低耦合/松耦合) 我有一个项目的arraylist,这个arraylist有一个getter,我想知道为什么在java中使用迭代器比使用arraylist更好 是否因为迭代器可以在需要时转换为不同的集合?或者还有其他我不知道的好处吗?纯粹从这两个类之间的松耦合或紧耦合的角度来看,没有什么不同-我最初会对此有一些不同意见,但我将在下面解释原因。如果出于其他原因有更好的选择,这是一个不同的问题,但耦合实际上并不是其中之一 从接口的角度

所以我今天听说返回迭代器是比返回arraylist更好的解决方案(低耦合/松耦合)

我有一个项目的arraylist,这个arraylist有一个getter,我想知道为什么在java中使用迭代器比使用arraylist更好


是否因为迭代器可以在需要时转换为不同的集合?或者还有其他我不知道的好处吗?

纯粹从这两个类之间的松耦合或紧耦合的角度来看,没有什么不同-我最初会对此有一些不同意见,但我将在下面解释原因。如果出于其他原因有更好的选择,这是一个不同的问题,但耦合实际上并不是其中之一

从接口的角度来看,类A引用了具有集合的类B。B返回arraylist,这意味着它返回java.util.arraylist(独立于a或B的第三个类)。如果返回一个java.util.Iterator,则还有一个独立于a或B的第三类。在这两种情况下,a都不需要更多或更少的B内部工作的知识,因此耦合保持不变

但是,根据注释/其他答案,您可能会出于其他原因选择返回集合(不指定实际实现)或迭代器。如果您正在创建一个公共API,那么选择是很重要的。如果您是在自己的代码内部执行此操作,请使用调用方最容易的选项


如果这只是一个类练习,请回答迭代器是松散耦合的,因为它们可能没有正确地进行区分。

如果您决定在某个时间点不使用Arraylist,而是使用List或其他任何东西,则无需更改依赖代码

也许溪流工厂是更好的选择。仅通过流公开集合的最大好处是它可以更好地封装域模型的数据结构。域类的任何使用都不可能仅仅通过公开流来影响列表或集合的内部工作。
请阅读此

另外,迭代器(至少如果使用正确的话)不会在迭代arraylist的内容时引诱您修改arraylist,因为该arraylist不包含在处理其元素的代码中。因为您可以使用不同的集合实现来获取迭代器,但是所有的集合实现都有迭代器。@Mike'Pomax'Kamermans:如果你想使用迭代器,你可以完全改变集合。它至少保证您不会添加更多的元素,但如果您想要一个真正的只读列表,
Collections.unmodifiableList()
最好返回。没错,但我猜您听到的部分原因是有人读到了关于该列表的内容,并将其理解为“优于列表”。请注意,在某些情况下,人们更喜欢返回具体类型,以便为调用方法(或程序员)提供有关如何使用该实例的某些提示。例如,当一个人返回一个番石榴。调用方法应该“知道”,他不能调用某些修改方法,而不会得到异常。当然,这也可以在JavaDoc中解释,但是使用它作为返回类型可以确保不会遗漏这一点。