Quiero representar algunos pares clave-valor en un tipo de enumeración UML. Por ejemplo, digamos que tenemos algunos elementos y su símbolo:
ROAD => 'R' CAR => 'C' NOTHING => ' '
En Java sería algo similar a lo siguiente:
public enum AsciiCodes { ROAD ('R'), CAR ('C'), NOTHING (' '); private final char code; private AsciiCodes(char code) { this.code = code; } }
¿Cómo puedo representar eso en UML?
Lo que tengo hasta ahora:
En UML ROAD, CAR y NOTHING son EnumerationLiteral y en un diagrama de clase se muestran en los literales de compartimiento mostrando su nombre, y nada más de ellos.
Una enumeración que es un tipo de datos puede tener una propiedad, sin embargo, el código de atributo de su Java no puede ser compatible con una propiedad como lo hizo porque no se refiere a la enumeración sino al EnumerationLiteral .
Por supuesto, un EnumerationLiteral no es una propiedad de la enumeración ni una instancia de la enumeración, sino una InstanceSpecification .
Por lo tanto, no hay nada estándar que permita modelar el código y su valor para cada literal de enumeración hasta que extienda la enumeración a través de un estereotipo para agregar código como StructuralFeature , en ese caso, los valores del código se especificarán a través de una ranura .
En formal/2017-12-05 ver :
[editar]
Representación alternativa en UML inspirada en la lectura de la respuesta de Christophe .
Otra forma es olvidarse por completo de UML EnumerationLiteral y modelar cada literal de enumeración de Java a través de una instancia dedicada disponible a través de un atributo estático de solo lectura.
AsciiCodes puede ser todavía una enumeración UML.
Tenga en cuenta que en su definición de Java y más arriba, el valor del código no está disponible desde el exterior, y finalmente es inútil hasta que se agrega una operación para devolverlo como se propone en la respuesta de Christophe .
Por cierto así sigo implementando las enumeraciones en la API del plug-out de BoUML para Java, usando el estereotipo enum_pattern especialmente manejado por el generador de código Java. Empecé a distribuir BoUML en 2005 cuando la enumeración aún no existía en Java.
Me gustaría agregar algunos matices a la excelente e inspiradora respuesta de Bruno .
Una enumeración UML es un clasificador. Como tal, puede tener perfectamente sus propias propiedades y operaciones, incluso si la mayoría de las veces solo define enumeraciones literales (ver también esta respuesta SO ). Esto está muy cerca de las enumeraciones de Java.
Las enumeraciones de Java proporcionan, sin embargo, algo de azúcar sintáctico que permite asociar uno o varios valores constantes a cada literal de enumeración. El lenguaje le permite definir un constructor privado que usa estos valores constantes para inicializar el objeto enumerado. Esto significa que muy bien podría representar su enumeración en UML de la siguiente manera:
Nada en UML le permite modelar los valores constantes asociados a un literal de enumeración. Pero nada tiene por qué : esto es simplemente un detalle de implementación. Si desea las constantes en el modelo, puede documentarlas en una nota (yo no iría de esa manera porque solo abarrota el diagrama con detalles de implementación que no ayudan a comprender el diseño).
Tiene dos opciones para aclarar la inicialización:
Aconsejaría 2, porque transmite la verdadera intención del diseño. Sin el azúcar sintáctico, probablemente escribiría una declaración de case
muy larga para inicializar las propiedades con los valores correctos dependiendo de la enumeración literal.
La enumeración UML no proporciona nada más allá de lo que define explícitamente.
Pero todas las enumeraciones de Java se especializan en java.lang.Enum
, que ofrecen operaciones como name()
u operaciones de clase como values()
.
Si desea transmitir la disponibilidad de dichas funciones específicas del idioma, puede definir su propio estereotipo «Java enum»
que se especialice en el elemento de metamodelo de enumeración UML estándar.