类图(UML)中的HashMap

7

我为我的Java应用程序构建了UML 2.0类图。在我的代码中,我有一个HashMap数据类型的属性。但是,据我所知,UML标准中没有HashMap数据类型。问题是 - 我可以将HashMap用作类的属性数据类型吗?

更新

也许在图表中我只需要指向java.util包?并且可能在图表中将Map类放置在此包中?


2
一个属性通常不应该具有 HashMap 数据类型。它应该具有 Map<Foo, Bar> 数据类型。 - JB Nizet
4个回答

5
HashMap不应该在您的UML模型中出现。HashMap只是一个合格联合的实现。可能它甚至只是加速了未经限定的关联。因此,如果您有一个带有HashMap的类A,您将对UML类A、UML类B和从A到B的UML关联进行建模。如果这个关联由B的一个非属性键来确定,您可以为这个关联添加一个限定符。如果您的HashMap键是B的名称(并且B具有该名称作为一个属性),您可以简单地省略该限定符。 为了表示您的关联的实现(您想要使用HashSet实现它),您可以将其添加为关键字或为其创建一个构造型(更复杂)。

1
HashMap是一个类,它应该在UML模型中存在。然而,并不是每个类都需要作为一个类出现在图表上。 - Martin Spamer

1

HashMap是Java中的概念名称,但每种编程语言都有一些类似于Hash<>Map<>的东西,因为许多模型包括Hash或Map容器属性,所以应该在UML中包含相应的内容。

一些工具支持<<map>>类型;如果您主要关心视觉直观性,我建议使用它 - 但无法确定所暗示的键的类型。

合格的关联图形UML设备不直观,我怀疑很难将其转换为任何有意义的前向代码生成。我会避免使用它。

另一种方法(通常我使用的方法)如下:

  • 创建一个哈希类,V和K作为通用参数。为了正确进行,K应该受到诸如“Ordered”这样的类的限制,UML中也缺乏此类(我们总是添加这个)
  • 对于每个哈希的使用,例如Hash<Thing, String>(注意顺序 - 我首先使用值,然后使用键),创建一个名为Hash<Thing,String>的UML类,并与Hash<>建立出站关系,然后将V和K映射到实际参数ThingString
  • 然后在想要使用它的类中定义一个属性,例如things,其类型为Hash<Thing,String>类型。

例如,MagicDraw支持此功能。

这样做的缺点是您将看不到客户端类和值类型(例如我的示例中的Thing)之间的关联链接。好处是,如果您将模型发布为程序员规范(这就是我们所做的),程序员可以在类表中看到正确的内容,如this example- translation_details attribute。在UML中执行此基本任务的困难只是UML的众多问题之一,这也是为什么我今天遇到的大多数开发人员除了在白板或文档上绘制图片外,不再使用它的原因。

1

在UML中,只需使用普通类并将其命名为HashMap。UML是与语言无关的,并不知道Java预定义的类。或者我误解了你的问题?


1
HashMaps不应该出现在UML模型中,特别是不应该作为一流的分类器。 - Christian
3
@Christian: 你所说的没有意义。我可以在UML中创建任何数据类型。如果我想要把一个类命名为HashMap并与另一个类建立组合关系,有什么阻止我这样做呢? - Tudor
1
当然可以将它放入UML模型中。没有什么阻止你这样做。只是将实现细节放入概念模型中并不是一个好的风格,因为你在那里不需要这样做。请查看我的答案,了解另一种方法。 - Christian
顺便提一下,大多数 UML 工具都为 Java 提供了特殊的配置文件,因此与 UML 不同,您的模型不一定是语言无关的。 - Christian

0

HashMap只是众多Java类之一。
您可以在UML 2.0类图中使用任何Java类、接口或原始类型。
UML 2.0 Java类图中的任何数据类型都对应于某个Java类、接口或原始类型。

您正在使用UML图来开发自己的应用程序。因此,随意扩展UML 2.0标准以方便您自己使用。没有人会责怪您这样做。


1
如果你真的必须在你的UML模型中使用Java类(我不建议这样做),那么这只是扩展你的模型(或库模型)。通过配置文件来扩展UML - 在这种情况下并不需要。 - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,