2.9.3 パラメタの受け渡し
IDLのinパラメタはJavaでは通常の実パラメタにマッピングされます。IDLオペレーションの結果は,該当するJavaメソッドの結果として返されます。
IDLのoutパラメタおよびinoutパラメタは,Javaパラメタ受け渡しメカニズムに直接マッピングされません。Javaでこれらのパラメタモードをインプリメントするために使用されるすべてのIDL基本型とユーザ定義型を,マッピングが定義します。IDLのoutパラメタまたはinoutパラメタが(コールバイバリューで)渡されるホルダJavaクラスのインスタンスを,クライアントが提供します。ホルダインスタンスの内容(インスタンス自身ではない)は呼び出しによって変更され,呼び出しが返されると,クライアントは変更(された可能性のある)内容を使用します。
- コードサンプル2-22 Java実パラメタへのinパラメタのマッピング
/*From Example.idl:*/ module Example { interface Modes { long operation(in long inArg, out long outArg, inout long inoutArg); }; }; //Generated Java: package Example; public interface Modes extends com.inprise.vbroker.CORBA.Object, Example.ModesOperations, org.omg.CORBA.portable.IDLEntity { } public interface ModesOperations { public int operation(int inArg, org.omg.CORBA.IntHolder outArg, org.omg.CORBA.IntHolder inoutArg); }
コードサンプル2-22では,結果は通常の結果として返され,実際のinパラメタは通常の値だけで返されます。しかし,outパラメタおよびinoutパラメタでは,該当するホルダが構成されなければなりません。一般的な使用例をコードサンプル2-23に示します。
- コードサンプル2-23 outパラメタおよびinoutパラメタのHolder
// user Java code // select a target object Example.Modes target = ...; // get the in actual value int inArg = 57; // prepare to receive out IntHolder outHolder = new IntHolder( ); // set up the in side of the inout IntHolder inoutHolder = new IntHolder(131); // make the invocation int result = target.operation( inArg, outHolder, inoutHolder); // use the value of the outHolder ... outHolder.value ... // use the value of the inoutHolder ... inoutHolder.value ...
メソッド呼び出し前に,実際のパラメタとなるホルダインスタンスの中で,inoutパラメタの入力値が設定されなければなりません。inoutホルダは,値からの新ホルダを構成するか,または該当する型の既存のホルダの値に割り当てると満たされます。呼び出し後,クライアントはoutHolder.valueを使用してoutパラメタの値にアクセスし,inoutHolder.valueを使用してinoutパラメタの出力値にアクセスします。IDLオペレーションのリターン結果は,呼び出しの結果として利用できます。