为啥返回一个迭代器低耦合(OOP)?
Posted
技术标签:
【中文标题】为啥返回一个迭代器低耦合(OOP)?【英文标题】:Why is returning a Iterator low coupling (OOP)?为什么返回一个迭代器低耦合(OOP)? 【发布时间】:2016-10-02 16:55:45 【问题描述】:所以我今天听说返回一个迭代器是一个更好的解决方案(低耦合/松耦合),而不是返回一个数组列表。
我有一个项目数组列表,我有一个用于这个数组列表的 getter,我想知道为什么在 java 中获取一个迭代器是一个更好的解决方案?
是不是因为迭代器可以根据需要转换成不同的集合?还是有更多我不知道的好处?
【问题讨论】:
也是迭代器——至少如果使用得当——不会诱使您在迭代其内容时修改数组列表,因为该数组列表不参与处理它的代码元素。 因为可以使用不同的集合实现来获取迭代器,但是所有集合实现都有迭代器。 @Mike'Pomax'Kamermans:如果你想使用它的迭代器,你可以完全改变集合。它至少可以保证您不会添加更多元素,但如果您想要一个真正的只读列表,Collections.unmodifiableList()
会更好地返回。
没错,但我猜你听到的部分原因是有人读到了iterator pattern 并将其理解为“比列表更好”。
请注意,在某些情况下,人们更喜欢返回具体类型,以便为调用方法(或程序员)提供有关如何使用该实例的某些提示。例如,当一个人返回 Guavas immutable collection classes 之一时。调用方法应该“知道”,他不能调用某些修改方法,而不会出现异常。当然,这也可以在 JavaDoc 中解释,但使用它作为返回类型可以确保不会错过。
【参考方案1】:
也许流工厂是更好的选择。仅通过 Stream 公开集合的最大优势在于它更好地封装了域模型的数据结构。任何使用域类都不可能仅仅通过暴露 Stream 来影响 List 或 Set 的内部工作。 另请阅读Should I return a Collection or a Stream?
【讨论】:
【参考方案2】:如果您决定某个时间点不想使用 Arraylist 而是使用 List 或其他任何东西,则不必更改依赖代码..
【讨论】:
【参考方案3】:纯粹从两个类之间松散或紧密耦合的角度来看,它没有任何不同 - 我最初会对此有所不同,但我将在下面解释原因。如果出于其他原因有更好的选择,这是一个不同的问题,但耦合实际上并不是其中之一。
从接口的角度来看,您的 A 类引用了具有该集合的 B 类。 B 返回数组列表,这意味着它返回 java.util.ArrayList(独立于 A 或 B 的第三类)。如果您返回一个 java.util.Iterator,那么您还有一个独立于 A 或 B 的第三类。在这两种情况下,A 都不需要或多或少地了解 B 的内部工作原理,因此耦合保持不变。
但是,根据 cmets/其他答案,还有其他原因,您可能更愿意返回 Collection(不指定实际实现)或 Iterator。如果您要创建公共 API,那么选择很重要。如果您在自己的代码内部这样做,请使用对调用者最简单的选择。
如果这只是一个课堂练习,请回答迭代器的耦合更松散,因为它们可能无法正确区分。
【讨论】:
以上是关于为啥返回一个迭代器低耦合(OOP)?的主要内容,如果未能解决你的问题,请参考以下文章