java—如何在uml中建模枚举,以便它们表示键值关系?

cwxwcias  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(516)

我想在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来表示呢?
到目前为止我所拥有的:

jutyujz0

jutyujz01#

在umlroad中,car和nothing是enumerationliteral,在类图中,它们显示在显示它们的名称的分隔文字中,而不是其他文字。
作为数据类型的枚举可能具有属性,但是java中的属性代码不能像您所做的那样由属性支持,因为它与枚举无关,而与enumerationliteral有关。
当然,enumerationliteral不是枚举的属性,也不是枚举的示例,而是instancespecification。
因此,标准不允许为每个枚举文本建模代码及其值,除非您通过原型扩展枚举以添加代码作为结构特征,在这种情况下,代码的值将通过槽指定
正式/2017-12-05见:
§ 10.5.3枚举第175页
§ 10.5.4枚举文字第175和176页
§ 9.9.9示例规范第140页
[编辑]
受克里斯托夫答案的启发,uml中的替代表示法。
另一种方法是完全忘记uml enumerationliteral,并通过一个通过静态只读属性提供的专用示例对每个java枚举文本进行建模。
asciicodes仍然可以是uml枚举。

请注意,在java定义和上面的代码中,代码的值从外部是不可用的,直到添加了一个操作以返回christophe的答案中建议的值,代码的值才最终是无用的。
顺便说一句,这就是我如何在boumlforjava插件的api中实现枚举,使用java代码生成器专门管理的原型enum\u模式。我在2005年开始分发bouml,当时java中还没有枚举。

a2mppw5e

a2mppw5e2#

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

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

uml枚举是一个分类器。因此,它完全可以拥有自己的属性和操作,即使大多数时候它只定义enum literals(也可以参见这个答案)。这与java枚举非常接近。
然而,java枚举提供了一些语法糖,允许将一个或多个常量值与每个枚举文本相关联。该语言允许您定义一个私有构造函数,该构造函数使用这些常量值初始化枚举对象。这意味着您可以很好地用uml表示枚举,如下所示:

与枚举相关的常量值是什么?

uml中的任何内容都不允许您对与enum literal相关联的常量值进行建模。但没什么必要:这只是一个实现细节。如果您想要模型中的常量,您可以将它们记录在一个注解中(我不会这样做,因为它只是将图中的实现细节弄乱了,这无助于理解设计)。
您有两个选择来澄清初始化:
您可以使用与代码中相同的签名定义一个显式构造函数,其优点是它接近您的代码。但是uml不是代码的替代品,不是吗?。不便之处在于,对于uml读者来说,这是一种误导性的不清楚:它给人的印象是这些初始化参数是免费的;
依赖于没有参数的构造函数。其优点是它反映了设计的真实性:构造函数参数不是自由的,因为java使用直接从enum literal导出的常量值调用构造函数。
我建议2,因为它传达了真正的设计意图。如果没有语法上的糖分,你可能会写一篇很长的文章 case 语句来初始化属性,根据枚举类型使用正确的值。

其他的javaenum特性呢?

uml枚举没有提供任何超出您明确定义的内容。
但是java枚举都是专门化的 java.lang.Enum ,提供以下操作: name() 或类操作,例如 values() .
如果你想传达这种特定语言特性的可用性,你可以定义你自己的原型 «Java enum» 它专门用于标准uml枚举元模型元素。

相关问题