【问题标题】:Java and UML: Relationship between a LinkedList class and an Iterator InterfaceJava 和 UML:LinkedList 类和迭代器接口之间的关系
【发布时间】:2021-01-19 20:40:14
【问题描述】:

我有几个关于 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 变量中。

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

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

谢谢。

【问题讨论】:

  • @bruno 抱歉,最近比较忙,没时间看。再次抱歉。不过谢谢你的回答。
  • 没问题,我只是很惊讶没有反应;)

标签: java uml modeling diagram


【解决方案1】:

如果Java有析构函数,如果我销毁链表,我是否需要调用迭代器的析构函数?

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

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

对我来说,列表本身不需要知道迭代器,而迭代器本身也不需要知道列表,所以对于问题 1,GenericLinkedList<T>GLLIterator<T> 之间根本没有关系。

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

对于问题 3,一个没有实现的接口不能使用其他东西,这与实现类相反。

【讨论】:

  • 对于(1)和(3),即使一个列表函数返回一个类型迭代器,是否也没有关联?我的印象是,如果一个类在其代码中“提及”另一个类,则两个类会有某种关联。用析构函数回答理论问题是有道理的,谢谢。
  • @thegoodhunter-9115 一个关联对应一个属性,返回值不需要那个
  • 啊,好吧。再次感谢。
猜你喜欢
  • 2014-03-28
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2022-01-12
相关资源
最近更新 更多