Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Java プロキシ・クラス・マッピング

Caché Java バインディングは Caché クラスの定義を読み取り、その情報を使用して、対応する Java クラスを生成します。生成したクラスによって、Caché オブジェクトのインスタンスに Java アプリケーションからリモート・アクセスできるようになります。この章では、Caché のオブジェクトとデータ型が Java コードにどのようにマップされるかを説明します。また、Caché Java バインディングのオブジェクトとメソッドについても詳しく説明します。

クラス

Caché クラスのプロジェクションは、以下に示す名前付け規約に従って、Java クラスとしての名前を受け取ります。クラスのタイプ (永続かシリアルかなど) によって、それに対応する Java スーパークラスが決まります。例えば、永続クラスの場合、それに対応する Java クラスは Java Persistent クラスから派生されます。

エンティティ名

クラス名やメソッド名などの Caché 識別子は、通常、対応する同じ名前の Java 識別子に投影されます。Caché 識別子が Java の予約語である場合、対応する Java 識別子の前にはアンダースコア ("_") が付きます。

Caché Basic および ObjectScript の名前付け規約の詳細は、"Caché ObjectScript の使用法" の "変数"、"Caché オブジェクトの使用法" の "名前付け規約"、"Caché Basic の使用法" の "識別子と変数"、および "Caché プログラミング入門ガイド" の "識別子のルールとガイドライン" を参照してください。

クラス名

クラス名は変更されません。すべての Caché パッケージが Java パッケージになります。その際、パッケージ名内の "%" 文字は "_" に変換されます。コード内で、Caché および Java パッケージ名が正確に一致している必要があります。

このルールの例外は、%Library パッケージです。%Library と Java ライブラリ・パッケージ間には一対一の対応はありませんが、最も一般的な %Library クラスのスタブが com.intersys.classes パッケージ内にあります。例えば、%Library.PersistentOpens in a new tab クラスは "com.intersys.classes.Persistent" としてマップされます。

プロパティ名

Caché プロパティを直接参照できます。Java のプロパティ処理形式に合わせるため、各 Caché プロパティのプロジェクションには 2 つのアクセサ・メソッド、つまり get<Prop>()set<Prop>() が含まれます。<Prop> は投影されたプロパティの名前です。プロパティ名が "%" で始まる場合は、"set_" に置き換わります。したがって、Color プロパティのプロジェクションには、getColor() メソッドと setColor() メソッドが含まれます。%Concurrency プロパティのプロジェクションには、get_Concurrency() メソッドと set_Concurrency() メソッドが含まれます。

メソッド名

通常、メソッド名は変更されずに直接マップされます。ただし、以下の例外があります。

  • メソッド名が "%" で始まる場合、"sys_" に置換されます。

  • メソッド名が Java の予約語の場合、名前の先頭に "_" が追加されます。

  • %Library パッケージの一部であるクラスのメソッドの場合、先頭の "%""_" に置換され、最初の文字が小文字に変換されます。

仮変数名

メソッドの仮リスト内の変数が "%" で始まる場合、"_" に変換されます。名前が Java の予約語の場合、その名前の先頭に "_" が追加されます。

パッケージ

一般に、クラスの Caché パッケージ名は、その Java パッケージ名として使用されます。Caché クラスでクラス・パラメータ JAVAPACKAGE が定義されている場合、Java ジェネレータでは、パッケージ名にそのパラメータ値が使用されます。

メソッド

Caché クラスのメソッドは、対応する Java クラスのスタブ・メソッドとして Java に投影されます。インスタンス・メソッドは Java インスタンス・メソッドとして、クラス・メソッドは Java スタティック・メソッドとして投影されます。クライアントで呼び出されたメソッドは、Caché サーバ上の実メソッド実装を呼び出します。

既定値が指定された引数を持つメソッド・シグニチャの場合、システムは異なる引数番号を持つ複数のメソッドを生成し、Java の既定引数値をシミュレートします。

例えば、1 メソッドのみを持つ単純な Caché クラスを定義すると仮定します。

   Class MyApp.Simple Extends %RegisteredObject {
      Method LookupName(id As %String) As %String {
         // lookup a name using embedded SQL
         Set name = ""
         &sql(SELECT Name INTO :name FROM Person WHERE ID = :id)
         Quit name
      }
   }

結果として、投影された Java クラスは以下のようになります。

   public class Simple extends Object {
      //...
      public String LookupName(String id) throws CacheException {
         // generated code to invoke method remotely...
         // ...
         return typedvalue;
      }
   }

投影されたメソッドが Java から呼び出されると、最初に Java クライアントはサーバ・オブジェクト・キャッシュを同期化し、その後 Caché サーバでメソッドを実行し、最終的に (存在する場合) 結果の値を返します。メソッド引数が参照呼び出しとして指定された場合は、それらの値も更新されます。

システム・メソッド

投影された Java クラスは、Caché クラスで定義されるあらゆるメソッドのほか、自動的に生成される多くのシステム・メソッドを含み、さまざまなサービスを実行します。これには、次のものがあります。

  • _close() — (オブジェクトの %Close メソッドを呼び出すことにより) クライアントから、サーバ上のオブジェクトを終了します。

  • _open() — 永続オブジェクトに対し、インスタンスの OID をハンドルとして使用して、データベース内に格納されたオブジェクトのインスタンスを開きます。

  • _openId() — 永続オブジェクトに対し、インスタンスのクラス ID 値をハンドルとして使用して、データベース内に格納されたオブジェクトのインスタンスを開きます。

NULL 値および空文字列を渡す

Caché では、Null 値と空の文字列の表現が異なることに注意してください。

  • Caché の Null 値は "" (空の文字列) で表されます。

  • Caché の空の文字列は $c(0) として表されます。

多くの Java プログラマには、この表現が直感的でないと感じられるかもしれませんが、Null の処理方法は SQL と同じです。

返り値のタイプが文字列でないメソッドから空の文字列が返された場合、その返り値は Null 値に変換されます。この場合、対応するオブジェクトを使用する前に、返り値が Null であるかどうかチェックする必要があります。例えば、以下のコード行では NullPointerException がスローされる可能性があります。

   return myCacheObject.getMyInteger().intValue();

これを回避するには、以下のチェックを実行します。

   Integer myInteger = myCacheObject.getMyInteger();
      if (myInteger == null) {
         // handle null value here
      } else
   return myInteger.intValue();

これは、参照によって返されるパラメータにも当てはまります。

プロパティ

2 つのアクセサ・メソッドを使用して、プロジェクションの各プロパティを参照できます。プロパティ値を取得するときは get<Prop>() を使用し、プロパティ値を設定するときは set<Prop>() を使用します。

(文字列や整数など) リテラル・プロパティ値は、適切な Java データ型クラス (StringInteger) を使用して表されます。

オブジェクト値を持つプロパティ値は、適切に投影された Java クラスを使用して表されます。get メソッドと set メソッドに加え、オブジェクト値を持つプロパティには、idset<Prop>()idget<Prop>() のように、そのオブジェクトの永続オブジェクト ID にアクセスするためのメソッドもあります。

例えば、リテラルとオブジェクト値の 2 つのプロパティを持つ Caché に、永続クラスを定義したと仮定します。

   Class MyApp.Student Extends %Persistent {
      /// Student's name
      Property Name As %String;
      /// Reference to a school object
      Property School As School;
   }

MyApp.Student の Java コードには、Name プロパティと School プロパティの両方に get アクセサと set アクセサがあります。また、参照される School オブジェクトのオブジェクト ID にアクセスするためのアクセサもあります。

   public class Student extends Persistent {
      // ...
      public String getName() throws CacheException {
         // implementation...
      }
      public void setName(String value) throws CacheException {
         // implementation...
      }
      public School getSchool() throws CacheException {
         // implementation...
      }
      public void setSchool(School value) throws CacheException {
         // implementation...
      }
      public Id idgetSchool() throws CacheException {
         // implementation...
      }
      public void idsetSchool(Id value) throws CacheException {
         // implementation...
      }
   }
プロパティのキャッシング

投影された Java オブジェクトが Java 内でインスタンスを生成すると、Caché サーバからプロパティ値のコピーを取り出し、ローカルの Java 側のキャッシュにそれらをコピーします。それ以降は、オブジェクトのプロパティ値へのアクセスはこのキャッシュに対して行い、サーバとの間で送信および受信するメッセージ数を減らします。Caché は自動的にこのローカル・キャッシュを管理し、Caché サーバで対応するオブジェクトの状態と確実に同期をとるようにします。

(プロパティ値が他のプロパティに依存する場合など) get メソッドまたは set メソッドを Caché クラス定義内で定義しているプロパティ値は、ローカル・キャッシュに保存されません。代わりに、そのようなプロパティにアクセスすると、対応するアクセサ・メソッドが Caché サーバ側で呼び出されます。これには、多量のネットワーク・トラフィックが必要となるため、Java 環境でこのようなプロパティを使用する場合、注意する必要があります。

基本データ型

Caché は、プロパティ、メソッドの返り値のタイプ、メソッド引数として、(文字列や数字など) さまざまなリテラル・データ型を使用します。Caché のすべてのデータ型には、対応するクライアント・データ型があります。このクライアント・データ型は、変数がマップされる Java クラスを指定します。したがって、クライアント・データ型を使用すると、それぞれの Caché データ型は、IntegerString などの適切な Java オブジェクトを使用して表されます。

プロパティのタイプに関係なく、未設定の値がある場合、Java は null キーワードを使用してその値を表します。例えば、Integer 型の Age プロパティを持つ新しいオブジェクトを作成したとします。このプロパティの値を設定する前に getAge() メソッドを呼び出すと、メソッドからは null が返されます。

既定では、Caché データ型の CLIENTDATATYPE キーワード値が、関連付けられる Java クラスを決定します。以下は、対応テーブルです。

クライアント・データ型と Java の関係

ClientDataType

Java クラス

Java パッケージ

ホルダー・クラス

BINARY

byteArray

null

ByteArrayHolder

BOOLEAN

Boolean

java.lang

BooleanHolder

CURRENCY

BigDecimal

java.math

BigDecimalHolder

DATE

Date

java.sql

DateHolder

DOUBLE

Double

java.lang

DoubleHolder

ID

Id (エクステント内のオブジェクト ID を表す Caché 提供クラス)

com.intersys.objects

IdHolder

INT

Integer

java.lang

IntegerHolder

LIST

SysList (Caché $List 構造の Java 実装)

com.intersys.objects

SysListHolder

LONG VARCHAR

String

java.lang

StringHolder

NUMERIC

BigDecimal

java.math

BigDecimalHolder

OID

Oid (完全なオブジェクト ID を表す Caché 提供クラス)

com.intersys.objects

OidHolder

STATUS

StatusCode (状態を表す Caché 提供クラス)

com.intersys.objects

StatusCodeHolder

TIME

Time

java.sql

TimeHolder

TIMESTAMP

TimeStamp

java.sql

TimeStampHolder

VARCHAR

String

java.lang

StringHolder

Void

void

null

null

オブジェクト値を持つタイプ (他のオブジェクト・インスタンスへの参照) は、対応する Java クラスを使用して表されます。一部の Caché オブジェクトは特殊ケースとして処理されます。例えば、ストリームは Java stream オブジェクトにマップされ、コレクションは collection オブジェクト (Java クライアント用としてインターシステムズが作成したクラス) として投影されます。メソッド引数が参照渡しの場合、IntegerHolderStringHolder など、"ホルダー" クラスを使用します。

JAVATYPE パラメータでは、既定値をオーバーライドして、プロパティを指定したクライアント Java クラスと関連付けることができます。

FeedbackOpens in a new tab