我如何在 UML 中对枚举建模以便它们表达键值关系?

How do I model enums in UML so they express a key-value relation?

我想在 UML 枚举类型中表示一些键值对。例如,假设我们有一些元素及其符号:

ROAD => 'R'
CAR => 'C'
NOTHING => ' '

在 Java 中,它将类似于以下内容:

public enum AsciiCodes { 
    ROAD  ('R'),
    CAR ('C'),
    NOTHING (' ');

    private final char code;

    private AsciiCodes(char code) {
        this.code = code;
    }
}

如何在 UML 中表示它?

我目前拥有的:

在 UML ROAD 中,CARNOTHINGEnumerationLiteral 并且在 class 图中,它们显示在隔间 文字 中,仅显示其名称,仅此而已。

作为 数据类型 的枚举可能具有 属性,但是 Java 中的属性 code 不能像你一样得到 属性 的支持,因为它不涉及枚举,而是 EnumerationLiteral.

当然 EnumerationLiteral 不是枚举的 属性 也不是枚举的实例,而是 InstanceSpecification .

因此,在您通过构造型扩展枚举以添加 code[= 之前​​,没有任何标准允许对 code 及其每个枚举文字的值进行建模64=] 作为 StructuralFeature,在这种情况下,code 的值将通过 Slot 指定

formal/2017-12-05中看到:

  • § 10.5.3 枚举页 175
  • § 10.5.4 EnumerationLiteral 第 175 和 176 页
  • § 9.9.9 实例规范页面 140

[编辑]

受阅读 的回答启发的 UML 替代表示法。

另一种方法是完全忘记 UML EnumerationLiteral 并通过静态只读属性本身可用的专用实例对每个 Java 枚举文字进行建模。

AsciiCodes仍然可以是一个UML枚举。

请注意,在您的 Java 定义及以上 code 的值从外部不可用,然后在向 return 添加操作之前最终无用正如 的回答中所建议的那样。

顺便说一句,这就是我仍然在 插件 BoUML for Java 的 API 中实现枚举的方式,使用由 Java 代码生成器专门管理的构造型 enum_pattern。我在 2005 年开始分发 BoUML,当时 Java.

中还没有枚举

我想对 出色而鼓舞人心的回答添加一些细微差别。

枚举可以在 UML 中具有属性和操作吗?

UML 枚举是一个class生成器。因此,它可以完美地拥有自己的属性和操作,即使大多数时候它只定义枚举文字(另请参见 )。这非常接近 Java 枚举。

然而,

Java enums 提供了一些语法糖,允许将一个或多个常量值关联到每个枚举文字。该语言允许您定义一个私有构造函数,该构造函数使用这些常量值来初始化枚举对象。这意味着您可以很好地在 UML 中表示您的枚举,如下所示:

与枚举文字关联的常量值是什么?

UML 中没有任何内容允许您对与枚举文字关联的常量值建模。 但不必如此:这只是一个实现细节。如果你想要模型中的常量,你可以在注释中记录它们(我不会那样做,因为它只会用无助于理解设计的实现细节使图表混乱)。

您有两种选择来阐明初始化:

  1. 您可以定义一个与您的代码具有相同签名的显式构造函数,其优点是它接近您的代码。 但是 UML 不能替代代码,不是吗?。不便之处在于它对 UML reader 的误导性不清楚:它给人的印象是这些初始化参数是免费的;
  2. 您依赖于不带参数的构造函数。优点是它反映了设计现实:构造函数参数不是自由的,因为 Java 使用直接从枚举文字中推导出的常量值调用构造函数。

我建议 2,因为它传达了真正的设计意图。如果没有语法糖,您可能会编写一个很长的 case 语句来根据枚举文字使用正确的值初始化属性。

其他 Java 枚举功能如何?

UML 枚举不提供任何超出您明确定义的内容。
但是 Java 枚举所有专门化 java.lang.Enum,它提供 name() 或 class 等操作,例如 values().

如果您想传达此类特定于语言的功能的可用性,您可以定义专门用于标准 UML 枚举元模型元素的 your own stereotype «Java enum»