本節では属性のマッピングについて検討します。
UMLの属性に対応するJavaのモデル要素は変数です。しかしJavaの変数には、UMLの属性に対応しないものもあり、UML属性とJava変数の対応は少しややこしくなっています。
UML属性とJava変数の関係を整理すると図7となります。
UMLの属性はJavaのインスタンス変数およびクラス変数に対応します。インスタンススコープを持ったUML属性がJavaインスタンス変数、クラススコープを持ったUML属性がJavaクラス変数となります。Javaの変数にはインスタンス変数とクラス変数以外にもいくつかあります。Javaの変数のコンストラクタパラメタとメソッドパラメタは、UMLのオペレーションパラメタに対応します。
ローカル変数と例外ハンドリングパラメタには、UMLに直接対応するモデル要素はありません。しかし、どちらもメソッドの実装に使用されるものであり、UMLの仕様外の部分となるので問題はありません。
問題があるのはJavaの定数です。Javaの定数はfinalとstaticの修飾子を伴った変数の形を取りますが、意味的にはまったく別物であり、定数として独立して考えた方がよいのです。
UML属性の部品とJava属性の部品の対応関係は図8となります。
属性名、型、可視性、初期値はUMLの部品とJavaの部品がそのまま対応します。
UMLのスコープはJavaのstaticの有無に対応します。Javaではstaticで修飾された属性のスコープはクラススコープ、staticで修飾されていない属性のスコープはインスタンススコープになりますが、これがそのままUMLのスコープの定義に対応します。
マッピングに検討が必要な部品は以下のものです。
多重度は値を複数持てる性質です。Javaのインスタンス変数/クラス変数そのものは多重度を持ってはいませんが、配列(Javaではオブジェクトの一種)やjava.lang.Listなどのコレクションライブラリを用いて表現することができます。Javaでは順序性についても直接インスタンス変数/クラス変数で表現することはできません。多重度と順序性については次回以降「アソシエーション」のところで説明することにします。
changeabilityは、属性の変更可能性に関するプロパティで、changeable、frozen、addOnlyのいずれかの値を取ります。changeableはJavaの通常のインスタンス変数/クラス変数と同じ意味を持ちます。frozenはJavaのfinalとは若干意味が異なります。addOnlyはJavaに対応する機能はありません。
Javaのみの部品として、以下の3つの修飾子が挙げられます。
final | 変数の更新は不可 |
---|---|
transient | 直列化対象でない |
volatile | マルチスレッドによる同期対象 |
transientとvolatileは、UMLにはまったく存在しないJava独自の機能です。UMLで表現する場合には、ユーザー定義のステレオタイプまたはプロパティを用いる必要があります。Javaのfinalは、UMLのchangeabilityとの関係が発生します。
Javaのfinalは変数の値は変更されないということを意味します。Javaの変数にはintやfloatなどプリミティブ型のデータの値またはjava.lang.Stringなどのオブジェクトへの参照が格納されます。このことからJavaのfinalは以下の意味を持っていることになります。
-オブジェクトがイミュータブルオブジェクト(不変オブジェクト)の場合、値は変更されない
-オブジェクトがイミュータブルオブジェクトでない場合、オブジェクトへの参照情報は変更されない
UMLのchangeabilityの値としてfrozenを取る場合、Javaのfinalと意味的に近くなります。しかし、frozenは「値は変更されない」という意味なので、「『オブジェクトがイミュータブルオブジェクトでない場合、オブジェクトへの参照情報は更新されない』ものの、参照先のオブジェクトの状態が変更されることは構わない」という点においてJavaのfinalとは意味が異なっているわけです。
UMLのみに存在する部品として以下のものを挙げることができます。
persistenceは、UML独自の機能であり属性の永続性に関するプロパティです。Javaには直接対応する機能はありません。
つまり、Javaでの実装を想定した設計モデルでは、あえて使う必要はないと思われます。もちろん、必要に応じて設計モデルで使用し、Javaでの実装の時点で、対応するアルゴリズムを手動で実装するという方法はあります。
Copyright © ITmedia, Inc. All Rights Reserved.