什么时候应该考虑实现Iterable<T>
而不是将集合作为实例字段?有什么好处/后果?
4 回答
JavaDoc说明了一切:
实现这个接口允许一个对象成为“foreach”语句的目标。
看看接口的实现者,什么时候使用它就很清楚了。如果您构建自己的集合(或用户应该能够迭代的“东西”),那么实现接口是有意义的。总而言之,根据我在“简单、标准”应用程序中的经验,您永远不会实现自己的Iterable
.
实现 Iterable 支持封装。您班级的用户(通常)不需要知道您使用的是链表还是哈希表,或者您有什么。
您可以更改实现细节,而无需修改任何使用您的类的代码。例如,也许您想根据项目的数量在集合之间切换。
您还可以控制用户可以做什么和不能做什么。如果您直接访问您的收藏,那么他们可能会在您不知情的情况下对其进行修改,这是一个非常糟糕的主意。
这个问题非常笼统,所以本着同样的精神来回答这个问题。
面向对象设计中一个普遍流行的原则是封装和隐藏实现细节。因此,如果您的容器仅仅是类的实现细节,那么它根本不应该是可见的。
更一般地说,如果您正在考虑直接公开数据成员,请三思而后行。一个精心设计的班级可能不应该只是将事情交给成员。相反,您希望为类提供描述类自身语义的有用方法。这些可能反过来使用内部容器,但容器本身不应该直接面向用户。
最后,如果您的类本身具有可迭代的语义(您可能会使用内部容器来实现),那么一定要给类本身提供迭代器。迭代器允许您使用通用算法,并且是使您的类在各种设置中可用的好方法。但是,请确保迭代器遍历一系列语义上有意义的值。他们可能会直接挖掘成员容器,或者他们可能会进行一些额外的处理和检查 - 无论哪种方式,迭代器都应该是你的,而不仅仅是某些成员容器的迭代器。
我会尽可能使用更通用的界面。Iterable<T>
比 更一般,如果List<T>
函数的客户端仅依赖于可迭代接口(而不依赖于列表接口),我更喜欢可迭代。这允许以后更改实现会更改接口的可能性很高。