我想用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表示?
到目前为止我所拥有的是:
发布于 2020-11-25 13:34:17
在UML中,CAR和NOTHING是EnumerationLiteral,在一个类图中,它们显示在显示其名称的分隔符中,而没有显示更多的名称。
作为Datatype的枚举可能具有属性,但是属性不能像您所做的那样支持来自Java的属性代码,因为它与枚举无关,而与EnumerationLiteral有关。
当然,EnumerationLiteral不是枚举的属性,也不是枚举的实例,而是InstanceSpecification。
因此,没有任何标准允许为每个枚举文字建模代码及其值,直到通过原型扩展枚举以将代码添加为StructuralFeature为止,在这种情况下,代码的值将通过一个槽指定。
在正式/2017-12-05中见:
编辑
在阅读克利斯朵夫的答案的启发下,UML中的替代表示。
另一种方法是完全忘记UML,并通过一个通过静态只读属性提供的专用实例对每个EnumerationLiteral枚举文本建模。
AsciiCodes仍然可以是一个UML枚举。
注意,在您的Java和上面的代码值是不可用的,然后最终无用,直到添加一个操作来返回它,如克利斯朵夫的答案中所建议的那样。
顺便说一句,我仍然是如何使用由Java代码生成器专门管理的原型BoUML实现enum_pattern插件的API中的枚举。2005年,当枚举在Java中还不存在时,我开始分发BoUML。
发布于 2020-11-26 00:09:52
我想在布鲁诺的精彩而鼓舞人心的回答中添加一些细微之处。
枚举可以在UML中具有属性和操作吗?
UML枚举是一个分类器。因此,它完全可以有自己的属性和操作,即使大多数时候它只定义枚举垃圾(也请参阅这就是答案)。这与Java枚举非常接近。
然而,Java枚举提供了一些语法糖,允许将一个或几个常量值与每个枚举文字相关联。该语言允许您定义一个私有构造函数,该构造函数使用这些常量值初始化枚举对象。这意味着您可以很好地用UML表示枚举,如下所示:
与枚举垃圾相关的常数值是什么?
UML中没有任何东西允许您对与枚举litteral关联的常量值进行建模。,但不需要:这只是一个实现细节。如果您想要模型中的常量,您可以在注释中记录它们(我不会这样做,因为它只是将图中的实现细节弄得杂乱无章,无助于理解设计)。
您有两个选择来澄清初始化:
我建议2,因为它传达了真正的设计意图。如果没有语法糖,您可能会编写一个非常长的case
语句来根据枚举litteral来用正确的值初始化属性。
其他Java枚举特性是什么?
UML枚举除了您明确定义的内容之外,没有提供任何其他内容。
但是Java都专门化java.lang.Enum
,它提供诸如name()
之类的操作或类操作(如values()
)。
如果您想传达这种特定于语言的特性的可用性,您可以定义专门使用标准UML枚举元模型元素的你自己的刻板印象 «Java enum»
。
https://stackoverflow.com/questions/65002225
复制相似问题