前回までは4回にわたって、アソシエーションに関するUMLの部品について詳細な検討を行ってきました。そもそもその目的は、UMLアソシエーションとJavaのマッピングをスムーズに実現させることにあるのですが、これがなかなか難しい作業です。以前検討した、UMLのクラスとJavaのクラスのマッピングも細かく考えていくと大変な作業でした(「第3回 静的モデル:クラスにおけるUMLとJavaのマッピング(1)」)。ですが、クラスはUMLとJavaにおいて多少の機能差があるとはいえ、同じ部品が用意されているため、UMLのみにあるモデル要素のアソシエーション(Java側には直接対応する部品がない)と比べて楽な作業であるともいえます。それでは、いよいよ今回は、Java側のアソシエーションに関する部品の検討を行っていきましょう。
アソシエーションに関するJava側の部品は以下の4つです。
基本部品となるのはインスタンス変数とクラス変数です。 多重度が2になるとインスタンス変数/クラス変数に加えて配列またはコレクションライブラリを併用します。
「第4回 静的モデル:クラスにおけるUMLとJavaのマッピング(2)」で説明したとおり、UMLの属性はJavaのインスタンス変数/クラス変数にマップされます。 そしてこれまでの説明で、属性だけでなくアソシエーションもインスタンス変数/クラス変数にマップされることが分かりました。 つまり、Javaプログラムで普通に利用されているインスタンス変数/クラス変数を、逆にUMLにマップする場合、属性とアソシエーションの両方が選択肢となるわけです。
Javaの配列はUMLでは、属性またはアソシエーション・エンドの多重度として表現されることになります。配列に格納されているオブジェクトによって属性またはアソシエーション・エンドのどちらになるか決まります。
Javaのコレクション機能は図1に示すCollection系のクラスと、図2に示すMap系のクラスから構成されます。大枠ではCollection系は多重度に、Map系は限定子に対応します。
●3.3.1 Collection
java.util.Collectionは図1に示すCollection系のコレクション機能の基本となるインターフェイスです。java.util.Collectionには以下のサブインターフェイスがあります。
java.util.Collectionとして以下の実装クラスが標準で用意されています。
なお、java.util.Vectorは過去との互換性のために用意されているクラス、java.util.Stackはjava.util.Collectionとしてはあまり意味を持たないクラスなので、アソシエーション・エンドの多重度を実装する目的という意味では、以下のクラスが選択肢となってきます。
Javaでの実装においては、以上の実装クラスを目的に応じて使い分けることになります。 もちろん用途に応じて、これら以外の実装クラスを自作したり、ほかのクラスライブラリのものを利用する必要も出てきます。
●3.3.2 List
java.util.Listとして以下の実装クラスが標準で用意されています。
前述したとおりjava.util.Vectorとjava.util.Stackは、UMLの多重度をマッピングする目的にはあまりふさわしくないので、選択肢は以下の2つになります。
java.util.ArrayListとjava.util.LinkedListの機能は前述したとおりです。
●3.3.3 Set
java.util.Setとして以下の実装クラスが標準で用意されています。
java.util.HashSetとjava.util.TreeSetの機能は前述したとおりです。
●3.3.4 SortedSet
java.util.SortedSetとして以下の実装クラスが標準で用意されています。
java.util.TreeSetの機能は前述したとおりです。
●3.3.5 Map
java.util.Mapは図2に示すMap系のコレクション機能の基本となるインターフェイスです。java.util.Mapとして以下の実装クラスが標準で用意されています。
なお、java.util.Hashtableは過去との互換性のために用意されているクラス、java.util.Properties、java.util.WeakHashMap、java.util.IdentifyHashMapの3つのクラスはjava.util.Collectionの機能よりも幅広い機能を持っているので、UMLの限定子をマッピングする目的にはあまりふさわしいクラスとはいえません。このため事実上の選択肢は以下の2つとなります。
Javaでの実装においては、以上の実装クラスを目的に応じて使い分けることになります。もちろん用途に応じて、これら以外の実装クラスを自作したり、ほかのクラスライブラリのものを利用する必要も出てきます。
●3.3.6 SortedMap
java.util.SortedMapとして以下の実装クラスが標準で用意されています。
java.util.TreeMapの機能は前述したとおりです。
以上、アソシエーションに関連するJava部品をまとめました。UMLのアソシエーションをJavaで実装するうえでの基本部品は、インスタンス変数とクラス変数です。アソシエーション・エンドの部品である多重度の実装には配列またはCollection系のコレクションライブラリを使用します。また、限定子の実装にはMap系のコレクションライブラリを使用します。
次回はこれらの部品を組み合わせて、Javaプログラムを前提としたUMLアソシエーションのプロファイルについて考えていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.