連載

Javaオブジェクトモデリング

第4回
静的モデル:クラスにおけるUMLとJavaのマッピング(2)

5.属性のマッピング

 本節では属性のマッピングについて検討します。

■■5.1 属性の種類■■

 UMLの属性に対応するJavaのモデル要素は変数です。しかしJavaの変数には、UMLの属性に対応しないものもあり、UML属性とJava変数の対応は少しややこしくなっています。 UML属性とJava変数の関係を整理すると図7となります。

図7 UML属性とJava変数の関係

 UMLの属性はJavaのインスタンス変数およびクラス変数に対応します。インスタンススコープを持ったUML属性がJavaインスタンス変数、クラススコープを持ったUML属性がJavaクラス変数となります。Javaの変数にはインスタンス変数とクラス変数以外にもいくつかあります。Javaの変数のコンストラクタパラメタとメソッドパラメタは、UMLのオペレーションパラメタに対応します。

 ローカル変数と例外ハンドリングパラメタには、UMLに直接対応するモデル要素はありません。しかし、どちらもメソッドの実装に使用されるものであり、UMLの仕様外の部分となるので問題はありません。

 問題があるのはJavaの定数です。Javaの定数はfinalとstaticの修飾子を伴った変数の形を取りますが、意味的にはまったく別物であり、定数として独立して考えた方がよいのです。

■■5.2 部品のマッピング■■

 UML属性の部品とJava属性の部品の対応関係は図8となります。

図8 UML属性とJava属性のマッピング(クリックすると拡大します)

5.2.1 共通の部品

 属性名、型、可視性、初期値はUMLの部品とJavaの部品がそのまま対応します。

 UMLのスコープはJavaのstaticの有無に対応します。Javaではstaticで修飾された属性のスコープはクラススコープ、staticで修飾されていない属性のスコープはインスタンススコープになりますが、これがそのままUMLのスコープの定義に対応します。

5.2.2 要検討の部品

 マッピングに検討が必要な部品は以下のものです。
  • 多重度
  • 順序性
  • changeability
 多重度は値を複数持てる性質です。Javaのインスタンス変数/クラス変数そのものは多重度を持ってはいませんが、配列(Javaではオブジェクトの一種)やjava.lang.Listなどのコレクションライブラリを用いて表現することができます。Javaでは順序性についても直接インスタンス変数/クラス変数で表現することはできません。多重度と順序性については次回以降「アソシエーション」のところで説明することにします。

 changeabilityは、属性の変更可能性に関するプロパティで、changeable、frozen、addOnlyのいずれかの値を取ります。changeableはJavaの通常のインスタンス変数/クラス変数と同じ意味を持ちます。frozenはJavaのfinalとは若干意味が異なります。addOnlyはJavaに対応する機能はありません。

5.2.3 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とは意味が異なっているわけです。

5.2.4 UMLのみの部品

 UMLのみに存在する部品として以下のものを挙げることができます。
  • persistence
 persistenceは、UML独自の機能であり属性の永続性に関するプロパティです。Javaには直接対応する機能はありません。

 つまり、Javaでの実装を想定した設計モデルでは、あえて使う必要はないと思われます。もちろん、必要に応じて設計モデルで使用し、Javaでの実装の時点で、対応するアルゴリズムを手動で実装するという方法はあります。

2/5

Javaオブジェクトモデリング 第4回
  “クラス”のマッピング
属性のマッピング
  オペレーションのマッピング
  サンプルプロファイル
  マッピング例


Javaオブジェクトモデリング INDEX


IT Architect 連載記事一覧

この記事に対するご意見をお寄せください managemail@atmarkit.co.jp

「ITmedia マーケティング」新着記事

「AIによる顧客体験(CX)向上」に懐疑的な見方が広がる――Qualtrics調査
Qualtricsが実施した年次グローバル調査から見えたカスタマーエクスペリエンス(CX)の現...

2025年のSNS大予測 AIの時代に「ソーシャル」はどう変わる?
もういくつ寝ると2025年……と数えるのはさすがに気が早いかもしれないが、それでも2024...

SEOで陥りがちな失敗は「アルゴリズム変更に対応できなかった」が最多に 原因は?
SEOの成功には何が必要なのか、失敗経験者へのアンケートで浮き彫りになったこととは……。