連載
Javaオブジェクトモデリング
第13回
静的モデル:アソシエーションのJavaの部品
浅海智晴
2003/9/18
前回までは4回にわたって、アソシエーションに関するUMLの部品について詳細な検討を行ってきました。そもそもその目的は、UMLアソシエーションとJavaのマッピングをスムーズに実現させることにあるのですが、これがなかなか難しい作業です。以前検討した、UMLのクラスとJavaのクラスのマッピングも細かく考えていくと大変な作業でした(「第3回 静的モデル:クラスにおけるUMLとJavaのマッピング(1)」)。ですが、クラスはUMLとJavaにおいて多少の機能差があるとはいえ、同じ部品が用意されているため、UMLのみにあるモデル要素のアソシエーション(Java側には直接対応する部品がない)と比べて楽な作業であるともいえます。それでは、いよいよ今回は、Java側のアソシエーションに関する部品の検討を行っていきましょう。 |
3.アソシエーションに関するJavaの部品 |
アソシエーションに関するJava側の部品は以下の4つです。
-
インスタンス変数
クラス変数
配列
コレクションライブラリ
基本部品となるのはインスタンス変数とクラス変数です。 多重度が2になるとインスタンス変数/クラス変数に加えて配列またはコレクションライブラリを併用します。
■■3.1 インスタンス変数とクラス変数■■
「第4回 静的モデル:クラスにおけるUMLとJavaのマッピング(2)」で説明したとおり、UMLの属性はJavaのインスタンス変数/クラス変数にマップされます。 そしてこれまでの説明で、属性だけでなくアソシエーションもインスタンス変数/クラス変数にマップされることが分かりました。 つまり、Javaプログラムで普通に利用されているインスタンス変数/クラス変数を、逆にUMLにマップする場合、属性とアソシエーションの両方が選択肢となるわけです。
■■3.2 配列■■
Javaの配列はUMLでは、属性またはアソシエーション・エンドの多重度として表現されることになります。配列に格納されているオブジェクトによって属性またはアソシエーション・エンドのどちらになるか決まります。
■■3.3 コレクション■■
Javaのコレクション機能は図1に示すCollection系のクラスと、図2に示すMap系のクラスから構成されます。大枠ではCollection系は多重度に、Map系は限定子に対応します。
図1 Javaコレクションライブラリ/Collection系 |
図2 Javaコレクションライブラリ/Map系 |
●3.3.1 Collection
java.util.Collectionは図1に示すCollection系のコレクション機能の基本となるインターフェイスです。java.util.Collectionには以下のサブインターフェイスがあります。
-
java.util.List
java.util.Set
java.util.SortedSet
java.util.Collectionとして以下の実装クラスが標準で用意されています。
-
java.util.ArrayList
java.util.LinkedList
java.util.Vector
java.util.Stack
java.util.HashSet
java.util.TreeSet
なお、java.util.Vectorは過去との互換性のために用意されているクラス、java.util.Stackはjava.util.Collectionとしてはあまり意味を持たないクラスなので、アソシエーション・エンドの多重度を実装する目的という意味では、以下のクラスが選択肢となってきます。
-
java.util.ArrayListは、配列の機能のうえにjava.util.Listを実装した具象クラスです。全般的に良い性能を出します。
java.util.LinkedListは、リンクを使ってjava.util.Listを実現した具象クラスです。要素の挿入や削除の実行速度が速い、ことが特徴です。
java.util.HashSetは、ハッシュ法を用いて値の重複を検出する機能を持つjava.util.Setの具象クラスです。
java.util.TreeSetは、バイナリツリーを用いて値の重複を検出する機能と値の順番に整列させる機能を両立させたjava.util.Sortedの具象クラスです。
Javaでの実装においては、以上の実装クラスを目的に応じて使い分けることになります。 もちろん用途に応じて、これら以外の実装クラスを自作したり、ほかのクラスライブラリのものを利用する必要も出てきます。
●3.3.2 List
java.util.Listとして以下の実装クラスが標準で用意されています。
-
java.util.ArrayList
java.util.LinkedList
java.util.Vector
java.util.Stack
前述したとおりjava.util.Vectorとjava.util.Stackは、UMLの多重度をマッピングする目的にはあまりふさわしくないので、選択肢は以下の2つになります。
-
java.util.ArrayList
java.util.LinkedList
java.util.ArrayListとjava.util.LinkedListの機能は前述したとおりです。
●3.3.3 Set
java.util.Setとして以下の実装クラスが標準で用意されています。
-
java.util.HashSet
java.util.TreeSet
java.util.HashSetとjava.util.TreeSetの機能は前述したとおりです。
●3.3.4 SortedSet
java.util.SortedSetとして以下の実装クラスが標準で用意されています。
-
java.util.TreeSet
java.util.TreeSetの機能は前述したとおりです。
●3.3.5 Map
java.util.Mapは図2に示すMap系のコレクション機能の基本となるインターフェイスです。java.util.Mapとして以下の実装クラスが標準で用意されています。
-
java.util.HashMap
java.util.TreeMap
java.util.WeakHashMap
java.util.IdentityHashMap
java.util.Hashtable
java.util.Properties
なお、java.util.Hashtableは過去との互換性のために用意されているクラス、java.util.Properties、java.util.WeakHashMap、java.util.IdentifyHashMapの3つのクラスはjava.util.Collectionの機能よりも幅広い機能を持っているので、UMLの限定子をマッピングする目的にはあまりふさわしいクラスとはいえません。このため事実上の選択肢は以下の2つとなります。
-
java.util.HashMapは、ハッシュ法を用いて値の検索を行う機能を持つjava.util.Mapの具象クラスです
java.util.TreeMapは、バイナリツリーを用いて値の検索を行う機能と値の順番に整列させる機能を両立させたjava.util.SortedMapの具象クラスです
Javaでの実装においては、以上の実装クラスを目的に応じて使い分けることになります。もちろん用途に応じて、これら以外の実装クラスを自作したり、ほかのクラスライブラリのものを利用する必要も出てきます。
●3.3.6 SortedMap
java.util.SortedMapとして以下の実装クラスが標準で用意されています。
-
java.util.TreeMap
java.util.TreeMapの機能は前述したとおりです。
■■3.4 Java部品のまとめ■■
以上、アソシエーションに関連するJava部品をまとめました。UMLのアソシエーションをJavaで実装するうえでの基本部品は、インスタンス変数とクラス変数です。アソシエーション・エンドの部品である多重度の実装には配列またはCollection系のコレクションライブラリを使用します。また、限定子の実装にはMap系のコレクションライブラリを使用します。
◆
次回はこれらの部品を組み合わせて、Javaプログラムを前提としたUMLアソシエーションのプロファイルについて考えていきましょう。
Javaオブジェクトモデリング INDEX |
IT Architect 連載記事一覧 |