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