連載
Javaオブジェクトモデリング
第15回
UMLアソシエーションの詳細解説
静的モデル:「順序付け」から「インターフェイス指定子」まで
浅海智晴
2003/11/19
Javaプログラムを前提としたUMLアソシエーションのプロファイルについて、前回「第14回
静的モデル:Javaを前提としたUMLアソシエーション」はマッピングの方針を明らかにして全体の方向性を示し、マッピングに必要な部品の説明を行い、「集約」「多重度」まで解説しました。今回は「順序付け」「変更可能性」「限定子」「インターフェイス指定子」まで解説を行います。 4.1 方針 4.2 変数のマッピング 4.3 必須の部品 4.4 集約 4.5 多重度 4.6 順序付け 4.7 変更可能性 4.8 限定子 4.9 インターフェイス指定子 4.10 配列 4.11 Collection 4.12 List 4.13 Set 4.14 SortedSet 4.15 Map 4.16 SortedMap 4.17 プロファイルのまとめ 編集局より 【連載】Javaオブジェクトモデリング は第15回目より、DevelopmentStyleからJavaSolutionに移管しました。 |
■■4.6 順序付け■■
順序付けの使い方はUMLの通常の使い方に沿っています。Javaでのマッピングはjava.util.Listとjava.util.SortedSetが軸です。
●4.6.1 UMLでの表現
順序付けを表現するために、制約orderedと制約sortedを使用します。図1の左側が制約orderedを使った場合、右側が制約sortedを使った場合です。
図1 プロファイル/順序付け(クリックで拡大) |
また、Javaでの実装との連携を目的として以下の独自タグ付き値を導入します。
-
collectionClass
タグ付き値collectionClassは、制約orderedまたは制約sortedを実現するためのコレクションの実装クラスを指定します。以上のタグ付き値を使用したアソシエーションはこの目的のため、図2のようになります。
図2 順序性の独自タグ付き値(クリックで拡大) |
また、省略形としては制約orderedおよび制約sortedをタグ付き値的に利用し、図2の下側のように実装クラスを定義することも可能です。この表記は、本来はUMLの文法違反ですが、ドローツールなどでUMLを記述している場合には、このような略記法があってもよいと思います。
●4.6.2 Javaでの実装/制約ordered
制約orderedは以下のルールでマップします。
-
型としてインターフェイスjava.util.Listを使用する
実装クラスのデフォルトとしてクラスjava.util.ArrayListを使用する
実装クラスを指定したい場合は独自タグ付き値collectionClassで指定する
このルールに沿って図1を実現したJavaプログラムは以下のようになります。
import java.util.List; public class Company { |
リスト1 順序付け/orderd |
また、図2に示した独自タグ付き値を実現したJavaプログラムは以下のようになります。タグ付き値collectionClassで実装クラスとしてjava.util.LinkedListを指定した場合です。インスタンス変数の型には java.util.Listが使用されます。
import java.util.List; public class Company { |
リスト2 順序付け/ordered/collectionClass |
●4.6.3 Javaでの実装/制約sorted
制約sortedは以下のルールでマップします。
-
型としてインターフェイスjava.util.SortedSetを使用する
実装クラスのデフォルトとしてクラスjava.util.TreeSetを使用する
実装クラスを指定したい場合は独自タグ付き値collectionClassで指定する
このルールに沿って図1を実現したJavaプログラムは以下のようになります。
import java.util.SortedSet; public class Company { |
リスト3 順序付け/sorted |
また図2示した独自タグ付き値を実現したJavaプログラムは以下のようになります。タグ付き値collectionClassで実装クラスとしてcom.example.MySortedSetを指定した場合です。インスタンス変数の型にはjava.util.SortedSetが使用されます。
import java.util.SortedSet; public class Company { |
リスト4 順序付け/sorted/collectionClass |
■■4.7 変更可能性■■
変更可能性は多重度が2以上の場合、マッピングが難しくなります。このため、本プロファイルでは使用方法を定義しません。補助的な使用にとどめておきます。
■■4.8 限定子■■
限定子もUMLの通常の使い方に沿っています。Javaでのマッピングはjava.util.Mapが軸となります。
●4.8.1 UMLでの表現
限定子を使ったアソシエーションは図3に示すように表現します。
図3 プロファイル/限定子(クリックで拡大) |
Javaとのマッピングを前提とすると限定子に指定する属性は、型が明確になっていなければなりません。ただし、限定子の型としては文字列(java.lang.String)が使われるケースが圧倒的に多いので、文字列の場合は省略可能とします。限定子の属性型はプリミティブ型かバリューオブジェクトのみとします。また、Javaでの実装との連携を目的として以下の独自タグ付き値を導入します。
-
collectionClass
タグ付き値collectionClassは、限定子を実現するためのコレクションの実装クラスを指定します。
●4.8.2 Javaでの実装
本プロファイルではUMLの限定子を以下のルールでJavaにマップします。
-
型としてインターフェイスjava.util.Mapを使用する
実装クラスのデフォルトとしてクラスjava.util.HashMapを使用する
実装クラスを指定したい場合は独自タグ付き値collectionClassで指定する
図3を実現したJavaプログラムは以下のようになります。
|
リスト5 限定子 |
また図3の右側に示した独自タグ付き値を実現したJavaプログラムは以下のようになります。タグ付き値collectionClassで実装クラスとしてcom.example.MyMapを指定した場合です。インスタンス変数の型には java.util.Mapが使用されます。
|
リスト6 限定子/collectionClass |
■■4.9 インターフェイス指定子■■
インターフェイス指定子の使い方も、UMLの通常の使い方に沿っています。Javaでのマッピングはインスタンス変数またはクラス変数の型として実装されます。
●4.9.1 UMLでの表現
インターフェイス指定子を使ったアソシエーションは図4に示すように表現します。
図3 プロファイル/インターフェイス指定子 |
●4.9.2 Javaでの実装
図1を実現したJavaプログラムは以下のようになります。
|
リスト7 インターフェイス指定子 |
インターフェイスIEmployeeとクラスPersonには図5に示すようにリアライゼーション(実現:realization)のリレーションシップがなければなりません。
図5 インターフェイス指定子関連のクラス |
いうまでもありませんが、この関係をJavaにマップすると以下のようにクラスPersonがインターフェイスIEmployeeをimplementsする形で実装されます。
|
◆
次回は今回の続きとして「4.10 配列」から解説していきます。
Javaオブジェクトモデリング INDEX |
Java Solution全記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|