问题描述
我对Java中的UML关系有一些疑问。
以下类和接口引用Java中的类和接口(已创建或现有)。
设置:
假设我有一个GenericLinkedList<T> implements Iterable<I>
类(带有私有Node<T> head
)。该类还具有静态内部类Node<D>
。
GenericLinkedList<T>
实现抽象方法iterator()
(来自Iterable<I>
),该方法返回Iterator<T>
。
实现Iterator<T>
,GLLIterator<T>
的类将GenericLinkedList<T>
对象作为参数(在其构造函数中),但仅将此列表的头存储在私有cur
变量中
- 即使
GLLIterator<T>
与GenericLinkedList<T>
之间的关系不包含前者,它是否仍为“ Composition”(黑色菱形指向该列表)?我认为这是因为没有“列表”的“重复者”是没有意义的。还是只是依赖,因为迭代器只是“使用”列表来获取head
? -
Node<D>
和GLLIterator<T>
之间的关系是聚合还是合成?我认为这将是聚合,因为我们可以在同一节点上拥有多个迭代器。但是,另一方面,当cur
节点死亡时,迭代器是没有意义的。 - 我会在列表类和迭代器接口或实现该接口的类之间绘制一个依赖关系吗?
编辑:我试图通过(1)进行如下推理: 因此,链表具有节点,而迭代器具有节点。 如果Java有析构函数,那么如果销毁链表,是否需要调用迭代器的析构函数? 如果销毁链表,则应该调用节点的析构函数。 但是迭代器与列表分开存在,它(1)只是指向列表中的一个节点,而(2)可以用作另一个列表的迭代器。 我问是因为我想知道迭代器类和链表类之间的UML关系:组合(所有者)或聚合(具有-a)。
谢谢。
解决方法
如果Java有析构函数,那么如果我销毁链表,是否需要调用迭代器的析构函数?
删除迭代器是因为它对应于已删除的节点(无论列表是否被删除,因此无论其所有节点是否被删除),这对我来说都是最糟糕的选择,这意味着迭代器会变得无声地无法使用,在执行时引入未定义行为的实用方法。
如果节点知道其迭代器,则一个好方法是在删除该节点时将其标记为无效,并且在这种情况下尝试访问列表中的相应元素或转到上一个/下一个元素会产生异常。 / p>
对我来说,列表本身不需要知道迭代器,并且迭代器也不需要知道列表本身,因此对于问题1,GenericLinkedList<T>
和GLLIterator<T>
之间根本没有关系
对于问题2,没有聚合也没有构成,因为迭代器仅引用一个节点,the iterator has a node
为假,所以迭代器既不由节点组成也不拥有节点。在相反的方向上,甚至一个节点也知道指向它的迭代器,即该节点不是由迭代器组成的,也不是拥有迭代器,而是仅引用它们。
如果节点知道迭代器,则您具有从节点到迭代器的多重性*
的关联,否则完全没有关系。
在迭代器中,您可以简单地与节点建立关联,多样性可以是0..1
(0表示迭代器无效)或1
,具体取决于实现方式。
对于问题3,没有实现的接口不能使用其他接口,这与实现类相反。