本節ではオペレーションのマッピングについて検討します。
UMLのオペレーションと、対応するJavaのモデル要素の関係は図9になります。UMLのオペレーションは、Javaのインスタンスメソッド、クラスメソッド、コンストラクタのいずれかにマッピングされるということです。
Javaのインスタンスメソッドとクラスメソッドの違いは、スコープにあります。つまり、インスタンススコープを持つメソッドがインスタンスメソッドであり、クラススコープを持つメソッドがクラスメソッドとなります。スコープという概念はUMLのオペレーションにもまったく同じものがあるので、そのままJavaのインスタンスメソッドおよびクラスメソッドに対応させることができます。
Javaのコンストラクタは、UMLではオペレーションとして表現することになります。ただし、ステレオタイプcreateを設定した特殊なオペレーションという扱いになります。
UMLオペレーションの部品とJavaメソッドおよびJavaコンストラクタの部品との対応関係は図10となります。
オペレーション名/メソッド名、返却値型/復帰型、可視性、パラメタ、例外はUMLの部品とJavaの部品がそのまま対応します。また、UMLのプロパティabstractとJavaの修飾子abstractも同じ意味です。いずれも抽象メソッドを表します。UMLのプロパティleafにはJavaの修飾子finalが対応します。
いずれもサブクラスでオーバーライドされないメソッドを表します。ステレオタイプcreateは、Javaのコンストラクタに相当します。
オペレーションの並行性を表現するために、UMLではプロパティconcurrencyを用意しており、以下の3つの値で表現します。
sequential | クライアント側で並行性を制御 |
---|---|
guarded | 複数のクライアントからの要求はガードされ同時に1つの要求のみが実行される |
concurrent | guardedではないが並行性を持っている |
それに対して、Javaではメソッドの修飾子としてsynchronizedを用意しています。synchronizedを指定されたメソッドは、UMLの concurrencyプロパティのguardedと同様に、複数のクライアントからの要求はガードされ同時に1つの要求のみが実行されるようになります。つまり、UMLのconcurrencyプロパティのguardedをJavaメソッドの修飾子synchronizedにマップすることは可能です。
synchronizedが指定されていないJavaメソッドはUMLのsequentialまたはconcurrentにマップされることになりますが、どちらにマップされるかは実装次第であり、機械的なマッピングを行うことはできません。
Javaのみの部品として、以下の2つの修飾子が挙げられます。
native | 外部のプログラムで実装 |
---|---|
strictfp | 浮動小数点の扱いを厳密に行う |
いずれもUMLに相当する機能がないので、ステレオタイプかプロパティで表現することになります。
UMLのみに定義されているオペレーションの機能を表現するステレオタイプとしてdestroyがあります。Javaにはステレオタイプに相当する機能はなく、また手動での実装も困難なのであえて利用することはないでしょう。UMLのみに定義されている機能を表現するプロパティは以下の2つです。
query | オペレーション呼び出しに伴う副作用がない |
---|---|
root | 親クラスのオペレーションをオーバーライドしない |
queryは、オペレーションの呼び出しに伴う副作用がないことを表現します。rootは、親クラスのオペレーションをオーバーライドしないメソッドであることを表現します。いずれも、直接Javaにマッピングできる機能はありません。参考情報として利用するのがよいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.