Java 和 UML:链表 class 和迭代器接口之间的关系

Java and UML: Relationship between a LinkedList class and an Iterator Interface

我对 Java 中的 UML 关系有一些疑问。

以下classes和接口引用Java.classes和接口(创建的或现有的)。

设置:

假设我有一个 GenericLinkedList<T> implements Iterable<I> class(带有私有 Node<T> head)。这个class还有一个static inner class Node<D>.

GenericLinkedList<T> 实现了抽象方法 iterator()(来自 Iterable<I>)returns 和 Iterator<T>。 实现Iterator<T>GLLIterator<T>的class接受一个GenericLinkedList<T>对象作为参数(在它的构造函数中),但是只是把这个列表的头部存储在一个私有的cur变量。

  1. GLLIterator<T>GenericLinkedList<T> 之间的关系是否是组合(黑色菱形指向列表),即使后者不包含前者?我认为这是因为没有“列表”,“迭代器”就毫无意义。或者它只是一个依赖项,因为迭代器只是“使用”列表来获取 head?
  2. Node<D>GLLIterator<T> 之间的关系是聚合还是组合?我认为这将是聚合,因为我们可以在同一个节点上有多个迭代器。但是,另一方面,当 cur 节点死亡时,迭代器就没有意义了。
  3. 我会在列表 class 和迭代器接口或实现该接口的 class 之间建立依赖关系吗?

编辑:我试图通过 (1) 推理如下: 所以,链表有节点,迭代器有节点。 如果 Java 有析构函数,我销毁链表时是否需要调用迭代器的析构函数? 如果我销毁链表,应该调用节点的析构函数。 但是迭代器存在于列表之外,它(1)只是指向列表中的一个节点,(2)可以用作另一个列表的迭代器。 我问是因为我想知道迭代器 classes 和链表 class 之间的 UML 关系:组合 (owns) 或聚合 (has-a)。

谢谢。

If Java had destructors, would I need to call the destructor of an iterator if I destroy the linked list?

删除一个迭代器,因为它对应于一个已删除的节点(无论列表是否被删除,所以它的所有节点是否被删除)对我来说是最糟糕的选择,这意味着迭代器变得无法使用,一种在执行时引入未定义行为的非常实用的方法。

如果一个节点知道它的迭代器,一个好方法是在节点被删除时将它们标记为无效,在这种情况下尝试访问列表的相应元素或转到 previous/next 元素产生一个例外。

对我来说,列表本身不需要知道迭代器,迭代器本身也不需要知道列表,所以对于问题 1,GenericLinkedList<T> 和 [=11 之间根本没有关系=].

对于问题2没有聚合也没有组合,因为迭代器只是引用一个节点,the iterator has a node为假,迭代器不由节点组成,也不拥有节点。在相反的方向上,即使一个节点也知道指向它的迭代器,该节点不是由迭代器组成的,也不拥有它们,但也只是引用它们。 如果一个节点知道迭代器,则节点与迭代器之间的关联具有多重性 *,否则根本没有关系。 在迭代器中,您与节点有一个简单的关联,多重性可以是 0..1(0 表示迭代器无效)或 1,具体取决于实现。

对于问题 3,没有实现的接口不能使用其他东西,与实现相反class(es)。