我想在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来表示呢?
到目前为止我所拥有的:
2条答案
按热度按时间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中还没有枚举。
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枚举元模型元素。