【问题标题】:What is meant by without exposing the 'internal structure'? (iterator)不暴露“内部结构”是什么意思? (迭代器)
【发布时间】:2023-03-26 08:01:01
【问题描述】:

迭代器的关键属性之一是

迭代器模式允许我们:

  • 访问集合的内容而不暴露其内部结构。

这究竟是什么意思,内部结构是什么?

【问题讨论】:

  • 这意味着您可以在不知道它们如何到达那里、如何删除、如何存储等情况下浏览每个项目...

标签: java oop collections iterator


【解决方案1】:

每个数据结构的实现方式都不同。一些结构可能使用链接设计,一些可能由单个数组支持,或者可能是两者的混合。想象一下,如果每次您想使用不同的 List 实现,您需要了解它的工作原理才能使用它。

Iterator 接口(连同其他接口)提供了一组一致的方法,允许您使用可迭代对象,即使您不知道它是如何“在后台”实现的。

【讨论】:

    【解决方案2】:

    内部结构是保存集合内容的私有成员。

    例如,在ArrayList 中,内部结构是一个支持数组,其中包含List 的元素:

    transient Object[] elementData;
    

    ArrayListiterator() 返回的Iterator 使您可以访问ArrayList 的元素,而无需访问支持数组,这意味着您不能直接改变支持数组。

    对于HashSet,内部结构是一个HashMap,它包含Set的元素:

    private transient HashMap<E,Object> map;
    

    同样,迭代器允许您访问 Set 的元素,而无需访问 HashMap

    【讨论】:

    • 非常感谢!
    • 迭代器提供了remove方法。所以,我认为“不能变异”这句话可以改写
    • @user7 请注意句子的其余部分 - “不能直接改变支持数组
    【解决方案3】:

    在此上下文中,内部结构表示集合类或接口的成员函数列表。但进一步思考,由于成员函数列表大致构成类/接口,内部结构意味着集合的类/接口。而且这个说法很宽泛,可以表示数组、包、队列等集合......

    迭代器是一种适配器,其接口通常与它所操作的集合不同。因此,使用迭代器不仅使我们能够隐藏集合的类声明(它定义了集合的内部结构),而且还使我们能够隐藏集合的公共接口(它可能是独立的并且比整个集合的类声明更小)。而且这个公共接口不是内部结构。所以你的原始陈述没有暴露其内部结构是可以的,但并不完全全面。

    迭代器不仅使我们免于暴露内部结构,而且免于暴露集合的公共接口。这为代码分离上下文中的迭代器概念提供了更多价值。

    【讨论】:

      【解决方案4】:

      作为一个简单的例子,可以迭代 TreeMap 来学习地图的所有成员。使用迭代器时,我不必关心映射下的树是否是二叉树、trie、b-tree、红黑树等。作为用户,我不想知道它如何维护其内部链接以读取其数据。我不想知道它的实现。寻求可维护性的软件应该减少用户需要了解其实施的数量。

      这种意义上的“结构”的使用方式与“数据结构”中的使用方式相同......一种在内存中组织数据以允许有效查找、插入、删除或其他操作的方式。迭代器通过调用next() 提供一种逐项获取数据的简单方法,隐藏了用于提高操作效率的组织方案的详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 2013-07-11
        • 1970-01-01
        • 2010-09-14
        • 2017-10-22
        • 2011-12-02
        相关资源
        最近更新 更多