首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在UML中对枚举进行建模,以便它们表示键值关系?

如何在UML中对枚举进行建模,以便它们表示键值关系?
EN

Stack Overflow用户
提问于 2020-11-25 09:52:52
回答 2查看 1.1K关注 0票数 3

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

代码语言:javascript
运行
复制
ROAD => 'R'
CAR => 'C'
NOTHING => ' '

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

代码语言:javascript
运行
复制
public enum AsciiCodes { 
    ROAD  ('R'),
    CAR ('C'),
    NOTHING (' ');

    private final char code;

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

如何用UML表示?

到目前为止我所拥有的是:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-25 13:34:17

在UML中,CAR和NOTHING是EnumerationLiteral,在一个类图中,它们显示在显示其名称的分隔符中,而没有显示更多的名称。

作为Datatype的枚举可能具有属性,但是属性不能像您所做的那样支持来自Java的属性代码,因为它与枚举无关,而与EnumerationLiteral有关。

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

因此,没有任何标准允许为每个枚举文字建模代码及其值,直到通过原型扩展枚举以将代码添加为StructuralFeature为止,在这种情况下,代码的值将通过一个槽指定。

正式/2017-12-05中见:

  • §10.5.3枚举第175页
  • §10.5.4 EnumerationLiteral第175和176页
  • §9.9.9 InstanceSpecification第140页

编辑

在阅读克利斯朵夫的答案的启发下,UML中的替代表示。

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

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

注意,在您的Java和上面的代码值是不可用的,然后最终无用,直到添加一个操作来返回它,如克利斯朵夫的答案中所建议的那样。

顺便说一句,我仍然是如何使用由Java代码生成器专门管理的原型BoUML实现enum_pattern插件的API中的枚举。2005年,当枚举在Java中还不存在时,我开始分发BoUML。

票数 4
EN

Stack Overflow用户

发布于 2020-11-26 00:09:52

我想在布鲁诺的精彩而鼓舞人心的回答中添加一些细微之处。

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

UML枚举是一个分类器。因此,它完全可以有自己的属性和操作,即使大多数时候它只定义枚举垃圾(也请参阅这就是答案)。这与Java枚举非常接近。

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

与枚举垃圾相关的常数值是什么?

UML中没有任何东西允许您对与枚举litteral关联的常量值进行建模。,但不需要:这只是一个实现细节。如果您想要模型中的常量,您可以在注释中记录它们(我不会这样做,因为它只是将图中的实现细节弄得杂乱无章,无助于理解设计)。

您有两个选择来澄清初始化:

  1. 使用与代码相同的签名定义显式构造函数,其优点是它与代码非常接近。但是UML不是代码的替代品,不是吗?。不便之处在于,对于UML读取器来说,它不太清楚:它给人的印象是这些初始化参数是免费的;
  2. 您依赖没有参数的构造函数。其优点是它反映了设计现实:构造函数参数并不是免费的,因为Java使用从枚举litteral直接推导出来的常量值调用构造函数。

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

其他Java枚举特性是什么?

UML枚举除了您明确定义的内容之外,没有提供任何其他内容。

但是Java都专门化java.lang.Enum,它提供诸如name()之类的操作或类操作(如values() )。

如果您想传达这种特定于语言的特性的可用性,您可以定义专门使用标准UML枚举元模型元素的你自己的刻板印象 «Java enum»

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65002225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档