Javaのクラスは前回ご紹介したとおり、図13のような形になります。この構造をモデル化したJavaクラスのメタモデルは図14となります。
Javaでは以下のクラスを言語仕様上特別扱いしています。
Javaでは、配列は特殊なオブジェクトとして実現されており、言語仕様で特別な意識をすることでC言語の配列のような効果を出しています。つまりUMLでは属性やアソシエーションの多重度という形でモデル化されるものが、Javaではクラスとして扱われているわけです。この点には注意が必要です。
Javaのインターフェイスは前回ご紹介したとおり、図15、16のような形になります。
Javaのインターフェイスは、“定数を宣言できる”という重要な機能を持っており、UMLのインターフェイスとはこの点に大きな相違点があります。
UMLのインターフェイスは「オペレーションの集まり」を表すものですから、定数の宣言を行うことができるJavaのインターフェイスは厳密な意味では違うものと考えることもできます。また、そもそもUMLには定数という概念はないので、「定数は属性の一種である」という仮説を持ち込まなければ、純粋にJava独自の言語機能と考えることもでき、「UMLのインターフェイス=Javaのインターフェイス」という定義は意味論上も矛盾しないと考えることもできます。いずれにしても、実用上はこのような細かな違いを厳密に扱うよりも、「Javaのインターフェイス=UMLのインターフェイス」と扱うことの方がはるかにメリットが多いことはいうまでもありませんし、本連載でもそのように扱っていきます。
Javaでは以下のインターフェイスを言語仕様上特別扱いしています。
Javaメソッドのメタモデルは図17となります。
Javaメソッドはプログラミング言語上は図18のように記述されます。
可視性は、public、protected、privateおよび表記の省略の4つの指定方法が用意されています。publicが公開、protectedが子孫クラスに公開、privateが公開しない、省略がパッケージ内に公開となっています。
メソッドの性質を示す修飾子としてstatic、final、abstractが用意されています。staticが指定されるとクラススコープのメソッドとなります。finalは子孫クラスによるメソッドのオーバーライドを許さないという指定、abstractは抽象メソッドの指定です。
メソッドの実装を示す修飾子としてnative、synchronized、strictfpが用意されています。
図17に示すとおり、staticとabstractの修飾子の指定によって、Javaでは3種類のメソッドを定義することができます。まず、1番上にあるのが通常のメソッドです。2番目にあるのが抽象メソッドです。抽象メソッドはメソッドのシグネチャの定義のみを行い実装は定義しません。3番目にあるのがクラスメソッドです。また、通常のメソッドは修飾子finalによって、子孫クラスでオーバーライドできないように指定することができます。
復帰値は必ず指定する必要があります。復帰値として値を返す必要がない場合はvoidを指定します。Javaでは、メソッドのシグネチャにメソッドが送出する可能性のある例外を定義することができます。
コンストラクタのメタモデルは図19となります。
コンストラクタにはstatic、final、abstract、native、synchronized、strictfpといった修飾子を付けることはないので、メソッドと比べるとかなり簡略された形になっています。また、コンストラクタはメソッドのような復帰型は持っていません。
JavaではUMLの属性に相当する機能として変数が用意されています。しかし、変数には多くの種類があり、その一部がUMLの属性に対応する形になっています。
●3.7.1 用途による分類
Javaの変数は用途によって図20の(1)に示す以下の種類に分類することができます。
この中で、インスタンス変数とクラス変数がUMLの属性に相当します。またコンストラクタパラメタとメソッドパラメタがUMLのオペレータのパラメタに相当します。ローカル変数と例外ハンドリングパラメタは、いずれもメソッドの実装に使用するものであり、UMLのモデル要素との直接の関係はありません。
●3.7.2 格納方法による分類
Javaの変数は格納する情報によって図20の(2)に示す種類に分類することができます。
Javaの変数には大きく分けてプリミティブ型と参照型があります。プリミティブ型の変数はプリミティブ型のデータを値として保持する変数です。それに対して参照型の変数はオブジェクトによる参照を保持する変数です。
Javaにおける配列は、配列オブジェクトによって実現されています。このため実行モデル上は配列オブジェクトに対する参照型の変数として実現されています。ただし、文法上はC言語の配列のように利用できるように考慮されているため、配列は通常の参照型の変数とは分けて考えます。
例えばJavaの変数のモデルは図21に示すようになります。この図ではオブジェクト内に3つの変数が定義されています。変数balanceはプリミティブ型の変数、変数personは一般的なオブジェクトに対する参照型の変数、変数personsは、配列オブジェクトに対する参照型の変数となっています。
●3.7.3 属性に相当する変数
UMLの属性に相当するJavaの変数はインスタンス変数とクラス変数になります。ここでは、インスタンス変数とクラス変数を総称して属性と呼ぶことにします。Java属性のメタモデルは図22となります。
Java属性はプログラミング言語上、図23のように記述されます。
可視性は、public、protected、privateおよび表記の省略という4つの指定方法が用意されています。publicが公開、protectedが子孫クラスに公開、privateが公開しない、省略がパッケージ内に公開となっています。
属性の性質を示す修飾子としてstatic、finalが用意されています。staticが指定されるとクラススコープの属性となります。finalは初期化あるいはコンストラクタ以外で値の設定を許さない属性の指定です。staticとfinalを同時に指定することもできますが、この場合は意味が変わり、定数の指定となります。
volatileとtransientは、属性に対する操作に関する修飾子です。
volatileは、複数のスレッドから同時にアクセスされた場合に矛盾を起こさない変数であることを示します。通常はvolatileの指定は外れているので、複数のスレッドから同時にアクセスした場合に内容に矛盾が生じても構わないことになります。
transientは、java.io.ObjectOutputStreamを使ってオブジェクトを直列化する場合に、直列化対象の変数ではないことを示します。通常はtransientの指定は外れているので、オブジェクトの直列化の際には直列化対象となりますが、直列化対象でありながらjava.io.Serializableでないオブジェクトがあった場合には例外が発生します。
浅海智晴(あさみ ともはる)
1985年立命館大学電気工学科卒業。同年富士通(株)入社。
UNIXワークステーション/サーバのOS、分散基盤、Web基盤の開発に従事。2001年11月より浅海智晴事務所代表。現在はオブジェクト指向、Java、XMLを中心に活動を行っている。
著書に「Java Super Tips オブジェクト指向設計編」、「XML/DOM Programming」(秀和システム)、
「やさしいUML入門」、「Relaxer - Java/XMLによるWeb開発」、 「XML SmartDoc公式リファレンスマニュアル」((ピアソンエデュケーション)がある。
代表作はJava&XMLベースのオープンソース・ソフトウェアである、
Copyright © ITmedia, Inc. All Rights Reserved.