Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 言語解説書


INVOKE ステートメント

INVOKE ステートメントは、COBOL または Java クラスのオブジェクト・インスタンスを生成したり、COBOL または Java クラスで定義されたメソッドを呼び出すことができます。

構文図を読む構文図をスキップする
フォーマット 

>>-INVOKE--+-ID-1-------+--+-リテラル-1-+----------------------->
           +-クラス名-1-+  +-ID-2-------+   
           +-SELF-------+  '-NEW--------'   
           '-SUPER------'                   

>--+-------------------------------------------------------+---->
   |        .--------------------------------------------. |   
   |        |                .-------------------------. | |   
   |        V                V                         | | |   
   '-USING----+----+--VALUE----+-+-----------+--ID-3-+-+-+-'   
              '-BY-'           | '-LENGTH OF-'       |         
                               '-リテラル-2----------'         

>--+-----------------+------------------------------------------>
   '-RETURNING--ID-4-'   

>--+-----------------------------------------+------------------>
   '-+----+--EXCEPTION---命令ステートメント-1-'   
     '-ON-'                                      

>--+----------------------------------------------+------------->
   '-NOT--+----+--EXCEPTION---命令ステートメント-2-'   
          '-ON-'                                      

>--+------------+----------------------------------------------><
   '-END-INVOKE-'   

ID-1
USAGE OBJECT REFERENCE として定義しなければなりません。 ID-1 の内容は、メソッドが呼び出されるオブジェクトを指定します。

ID-1 を指定するときは、リテラル-1 または ID-2 を指定し、呼び出すメソッドの名前を識別する必要があります。

以下の場合、INVOKE ステートメントの結果は未定義です。

  • ID-1 にオブジェクトへの有効な参照が入っていない場合
  • ID-1 に NULL が入っている場合
クラス名-1
クラス名-1リテラル-1 または ID-2 とともに指定すると、INVOKE ステートメントにより、クラス名-1 で参照されるクラスの静的メソッドまたはファクトリー・メソッドが呼び出されます。リテラル-1 または ID-2 は、呼び出されるメソッドの名前を指定します。クラス名-1 が Java クラスの場合は、メソッドを静的メソッドにする必要があります。クラス名-1 が COBOL クラスの場合は、メソッドをファクトリー・メソッドにする必要があります。

クラス名-1 を NEW と共に指定すると、INVOKE ステートメントにより、クラス名-1 クラスのインスタンスである新しいオブジェクトが生成されます。

クラス名-1 は、INVOKE ステートメントが入っているクラスまたはプログラムの 構成セクションの REPOSITORY 段落に指定する必要があります。

SELF
現在実行中のメソッドを呼び出す際に使用されたオブジェクトへの暗黙の参照です。SELF が指定されている場合、 INVOKE ステートメントはメソッドの手続き部内に現れなければなりません。
SUPER
現在実行中のメソッドを呼び出す際に使用されたオブジェクトへの暗黙の参照です。 呼び出されるメソッドを解決する際は、 現在実行中のメソッドのクラス定義内で宣言されているメソッドと、 そのクラスから派生されたクラス内で定義されているメソッドは無視されます。 したがって、呼び出されるメソッドは、親クラスから継承されたものになります。
リテラル-1
リテラル-1 の値は、呼び出すメソッドの名前です。 参照されるメソッドは、リテラル-1 によって識別されるメソッドをサポートしなければなりません。

リテラル-1 は英数字リテラルまたは国別リテラルでなければなりません。

リテラル-1 は、大文字小文字を区別して解釈されます。 INVOKE ステートメントの USING 句に指定したメソッド名、引数の数、および引数のデータ型は、 オブジェクトでサポートされた一致するシグニチャーを持つメソッドを選択する際に使用されます。 メソッドは、多重定義することができます。

ID-2
呼び出されるメソッドの名前が実行時に入れられる、英字、英数字、または国別カテゴリーのデータ項目。 参照されるオブジェクトは、ID-2 によって識別されるメソッドをサポートしなければなりません。

ID-2 を指定する場合は、オプションの句を指定せずに、ID-1 を USAGE OBJECT REFERENCE として定義する必要があります。つまり、ID-1 はユニバーサル・オブジェクト・リファレンスでなければなりません。

ID-2 の内容は、大文字小文字を区別して解釈されます。 INVOKE ステートメントの USING 句に指定したメソッド名、引数の数、および引数のデータ型は、 オブジェクトでサポートされた一致するシグニチャーを持つメソッドを選択する際に使用されます。 メソッドは、多重定義することができます。

ID-2 をウィンドウ表示日付フィールドにすることはできません。

NEW
NEW オペランドは、INVOKE ステートメントでクラス名-1 クラスの新しいオブジェクト・インスタンスを生成することを指定します。クラス名-1 は指定する必要があります。

クラス名-1 を Java でインプリメントした場合は、INVOKE ステートメントの USING 句を指定できます。 INVOKE ステートメントの USING 句に指定した引数の数と引数のデータ型は、 クラスでサポートされた一致するシグニチャーを持つ Java コンストラクターを選択する際に使用されます。 クラス名-1 クラスのオブジェクト・インスタンスは割り振られ、 選択されたコンストラクター (または、デフォルトのコンストラクター) は実行され、 生成されたオブジェクトへの参照は戻されます。

クラス名-1 を COBOL でインプリメントした場合は、INVOKE ステートメントの USING 句を指定することはできません。クラス名-1 クラスのオブジェクト・インスタンスは割り振られ、インスタンス・データ項目は関連する VALUE 節で指定 された値に初期化され、生成されたオブジェクトへの参照は戻されます。

NEW を指定する場合は、RETURNING 句も指定する必要があります。詳しくは、RETURNING 句を参照してください。

USING 句

USING 句は、ターゲット・メソッドに渡される引数を指定します。 引数のデータ型および引数のリンケージ規約は、Java でサポートされるものに制限されます。 詳細については、BY VALUE 句を参照してください。

BY VALUE 句

INVOKE ステートメントに指定する引数は、BY VALUE によって渡す必要があります。

BY VALUE 句では、送り出すデータ項目への参照ではなく、引数の値が渡されることが 指定されます。呼び出されるメソッドは、値によって渡された引数に対応する仮パラメーターを修正できますが、 呼び出されるメソッドは送り出しデータ項目の一時コピーへのアクセス権のみを持っているため、変更がこの引数に影響することはありません。

ID-3
データ部内の基本データ項目にしなければなりません。ID-3 のデータ型は、Java 相互協調処理に対応したデータ型にする必要があります。詳しくは、COBOL と Java の相互運用可能なデータ型を参照してください。 COBOL と Java における各種の引数の型には、ID-3 としてもサポートされる各種の例と、それらに対応する Java 型が 示されています。

ID-3 に適用される追加要件については、引数の適合性要件を参照してください。

リテラル-2
Java 相互協調処理に適した型にする必要があります。また、ターゲット・メソッドの中の対応するパラメーターの型と完全に一致している必要があります。 COBOL と Java における各種の引数の型には、サポートされるリテラルの形式と、それらに対応する Java 型が示されています。

リテラル-2 は DBCS リテラルであってはいけません。

LENGTH OF ID-3
ID-3 の長さを LENGTH OF 特殊レジスターの引数として渡すことを指定します。BY VALUE によって渡される LENGTH OF 特殊レジスターは、 PIC 9(9) バイナリー値として扱われます。LENGTH OF 特殊レジスターの詳細については、LENGTH OFを参照してください。

引数の適合性要件

ID-3 がオブジェクト・リファレンスのときには、以下の規則が適用されます。

  • そのオブジェクト・リファレンスのデータ記述項目に、クラス名を明示的に指定する必要があります。つまり、ID-3 は、ユニバーサル・オブジェクト・リファレンスにはしないでください。
  • 指定されたクラス名は、呼び出されるメソッドの中の対応するパラメーターのクラスと完全に同じクラスを参照する必要があります。つまり、ID-3 のクラスを、サブクラスまたは対応するパラメーターのクラスのスーパークラスにすることはできません。

ID-3 がオブジェクト・リファレンスではないときには、以下の規則が適用されます。

  • ターゲット・メソッドが COBOL でインプリメントされている場合、ID-3 の記述は、ターゲット・メソッド内の対応する仮パラメーターに完全に一致している必要があります。
  • ターゲット・メソッドが Java でインプリメントされている場合、ID-3 の記述は、COBOL と Java の相互運用可能なデータ型に示すように、ターゲット・メソッド内の対応する仮パラメーターの Java 型に対応している必要があります。

使用上の注意: 引数の適合性要件の順守は、プログラマーの責任範囲です。コンパイラーでは、これらの要件は検査されません。

RETURNING 句

RETURNING 句は、呼び出したメソッドから戻された値を入れるデータ項目を指定します。 INVOKE ステートメントに RETURNING 句を指定できるのは、COBOL または Java で作成されたメソッドを呼び出すときです。

ID-4
RETURNING データ項目。 ID-4 は、以下のように扱われます。
  • データ部内に定義しなければなりません。
  • 参照変更にすることはできません。
  • 例外が起きる場合は、変更されません。

ID-4 のデータ型は、Java 相互協調処理に対応したデータ型にする必要があります。詳しくは、COBOL と Java の相互運用可能なデータ型を参照してください。

ID-4 に適用される追加要件については、RETURNING 項目の適合性要件を参照してください。

ID-4 が指定され、ターゲット・メソッドが COBOL で作成されている場合、 そのターゲット・メソッドの手続き部ヘッダーには RETURNING 句が必要です。ターゲット・メソッドが戻されるときは、ID-4 が USAGE OBJECT REFERENCE を使用して記述された場合、SET ステートメントの規則を使用して、その戻り値が ID-4 に割り当てられます。それ以外の場合は、MOVE ステートメントの規則が使用されます。

RETURNING データ項目は、出力専用のパラメーターです。 呼び出されるメソッドに入った時点で、 PROCEDURE DIVISION RETURNING データ項目の初期状態の値は未定義であり予測不可能です。 呼び出されるメソッドの PROCEDURE DIVISION RETURNING データ項目を初期化してから、 値を参照するようにしてください。 呼び出したメソッドが戻されるとき、呼び出し側に渡される値は、PROCEDURE DIVISION RETURNING データ項目の最終的な値です。

Java で定義されたローカル・オブジェクト・リファレンスおよびグローバル・オブジェクト・リファレンスについては、Enterprise COBOL プログラミング・ガイドこれらの属性は、 オブジェクト・リファレンスの存続時間に影響を与えます。

使用上の注意: RETURN-CODE 特殊レジスターは、INVOKE ステートメントの実行では設定されません。

RETURNING 項目の適合性要件

INVOKE ステートメントにクラス名-1 NEW を指定するには、RETURNING 句が必要です。 RETURNING 項目は、以下のいずれかでなければなりません。

  • ユニバーサル・オブジェクト・リファレンス
  • クラス名-1 を指定したオブジェクト・リファレンス
  • クラス名-1
のスーパークラスを指定したオブジェクト・リファレンス

INVOKE ステートメントに NEW 句を指定しない場合、メソッド呼び出し、および対応するターゲット・メソッドで 指定される RETURNING 項目は、以下の要件を満たす必要があります。

  • 戻り値の有無は、INVOKE ステートメントおよびターゲット・メソッドと一致していなければなりません。
  • RETURNING 項目がオブジェクト・リファレンスではないときには、以下の規則が適用されます。
    • ターゲット・メソッドが COBOL でインプリメントされている場合、そのターゲット・メソッド内の INVOKE ステートメントと RETURNING 項目の中の RETURNING 項目には、同一のデータ記述項目がなければなりません。
    • ターゲット・メソッドが Java でインプリメントされている場合、COBOL と Java の相互運用可能なデータ型に示すように、INVOKE ステートメント内の RETURNING 項目は、そのメソッド結果の Java 型に対応していなければなりません。
  • RETURNING 項目がオブジェクト・リファレンスである場合、INVOKE ステートメントで指定されている RETURNING 項目は、ターゲット・メソッド内で指定された RETURNING 項目のクラスと同一の型のオブジェクト・リファレンスでなければなりません。つまり、ID-4 のクラスを、サブクラスまたはターゲット・メソッド内の RETURNING 項目のクラスのスーパークラスにすることはできません。

使用上の注意: RETURNING 項目の適合性要件の順守は、プログラマーの責任範囲です。コンパイラーでは、これらの要件は検査されません。

ON EXCEPTION 句

INVOKE ステートメントで指定されたメソッドのシグニチャーと一致する シグニチャーを持つメソッドが、識別されたオブジェクトまたはクラスでサポートされない場合は、 例外条件が発生します。例外条件が発生すると、以下のアクションのいずれかが実行されます。

  • ON EXCEPTION 句が指定されている場合は、制御は 命令ステートメント-1 に移ります。
  • ON EXCEPTION 句が指定されていない場合は、実行時に重要度-3 の Language Environment® 条件が発生します。

NOT ON EXCEPTION 句

例外条件が発生しない (つまり、識別されたメソッドが、指定されたオブジェクトでサポートされている) 場合、 制御は呼び出されるメソッドに移ります。呼び出されるメソッドから制御が戻ると、制御は次のものに移されます。

  1. 命令ステートメント-2。ただし NOT ON EXCEPTION 句が指定されている場合。
  2. INVOKE ステートメントの終わり。ただし、NOT ON EXCEPTION 句が指定されていない場合。

END-INVOKE 句

この明示的範囲終了符号は、INVOKE ステートメントの範囲を区切るために使用されます。END-INVOKE で終了する INVOKE ステートメントとそれに含まれるステートメントは、 命令ステートメントのように処理される単位になります。 INVOKE ステートメントは、条件ステートメント内の命令ステートメントとして指定できます。例えば、 別のステートメントの例外句の中に指定できます。

COBOL と Java の相互運用可能なデータ型

COBOL データ型のサブセットは、COBOL と Java の相互協調処理のために使用できます。

COBOL INVOKE ステートメントの引数や RETURNING 項目として、 相互運用可能なデータ型を指定できます。 同様に、これらのデータ型を Java メソッド呼び出し式から引数として渡し、USING 句のパラメーターとして、 または COBOL メソッドの手続き部ヘッダー内の RETURNING 項目として、それらを受け取ることができます。

以下の表には、相互協調処理でサポートされる基本的な Java 型と COBOL データ型、 およびそれらの間の対応関係が示されています。

表 1. 相互運用可能な Java と COBOL のデータ型
Java データ型 COBOL データ型
boolean1 形式に対する条件変数と 2 つの条件名
level-number  data-name        PIC X.
88            data-name-false  VALUE X'00'.
88            data-name-true   VALUE X'01' THROUGH X'FF'. 
byte 1 バイトの英数字、PIC X または PIC A
short USAGE BINARY、COMP、COMP-4、または COMP-5。PICTURE 節は S9(n) 形式 (1 <= n <= 4)
int USAGE BINARY、COMP、COMP-4、または COMP-5。PICTURE 節は S9(n) 形式 (5 <= n <= 9)
long USAGE BINARY、COMP、COMP-4、または COMP-5。PICTURE 節は S9(n) 形式 (10 <= n <= 18)
float2 USAGE COMP-1
double2 USAGE COMP-2
char

単一文字 (国別) : PIC N USAGE NATIONAL
(国別カテゴリーの基本データ項目)

クラス型
(オブジェクト・
リファレンス)

USAGE OBJECT REFERENCE クラス名
  1. Enterprise COBOL では、示された形式の 2 つの正確な条件名が PIC X データ項目の後に続く場合に限って、PIC X 引数またはパラメーターが Java boolean 型として解釈されます。それ以外の場合、 PIC X 引数またはパラメーターは、Java バイト型として解釈されます。
  2. Java 浮動小数点データでは、IEEE 浮動小数点表記が使用されます。 Enterprise COBOL では、IBM 16 進数浮動小数点表記が使用されます。COBOL から Java メソッドを呼び出す場合、および Java から COBOL メソッドを呼び出す場合、 これらの表記は、必要に応じて自動的に変換されます。

基本タイプに加えて、Java String と Java 基本型の配列も、COBOL と相互運用が可能です。 ただし、これを行うには、COBOL ランタイム・システムと Java Native Interface (JNI) で提供される特別なメカニズムが必要 となります。

配列データを COBOL に渡したり、COBOL から受け取ったりする場合、Java プログラムでは、 通常の Java 構文を使用して、配列の型を宣言します。 COBOL プログラムでは、配列をサポートするために提供されている特別なクラスのインスタンスを含むオブジェクト・リファレンス として、配列を宣言します。メソッドを呼び出す場合、Java 型と COBOL 型の間の変換は、自動的に行われます。

String データを COBOL に渡したり、COBOL から受け取ったりする場合、Java プログラムでは、 通常の Java 構文を使用して、配列の型を宣言します。 COBOL プログラムでは、特別な jstring クラスのインスタンスを含むオブジェクト・リファレンス として、String を宣言します。メソッドを呼び出す場合、Java 型と COBOL 型の間の変換は、自動的に行われます。 以下の表には、Java 配列、String データ型、および対応する特別な COBOL データ型が示されています。

表 2. COBOL と Java の相互運用可能な配列および String データ型
Java データ型 COBOL データ型
boolean[ ] オブジェクト・リファレンス jboooleanArray
byte[ ] オブジェクト・リファレンス jbyteArray
short[ ] オブジェクト・リファレンス jshortArray
int[ ] オブジェクト・リファレンス jintArray
long[ ] オブジェクト・リファレンス jlongArray
char[ ] オブジェクト・リファレンス jcharArray
Object[ ] オブジェクト・リファレンス jobjectArray
String オブジェクト・リファレンス jstring

以下の Java 配列型は、現在サポートされていません。

Java データ型 COBOL データ型
float[ ] オブジェクト・リファレンス jfloatArray
double[ ] オブジェクト・リファレンス jdoubleArray

REPOSITORY 段落では、他のクラスで項目をコード化するのと同様に、 使用する特別なクラスごとに項目のコード化が必要です。例えば、jstring を使用する場合は、以下の項目をコード化します。

Configuration Section.
Repository.
    Class jstring is "jstring".

また、String 型の場合は、COBOL リポジトリー項目で java.lang.String の外部クラス名を指定します。

Repository.
    Class jstring is "java.lang.String".

Java Native Interface (JNI) では、これらの型の COBOL オブジェクトを COBOL で操作するための 呼び出し可能なサービスが提供されています。 例えば、呼び出し可能サービスを使用すると、jstring オブジェクト内に COBOL の英数字データまたは国別データを 設定したり、jstring オブジェクトからデータを抽出したりすることができます。 JNI 呼び出し可能サービスの使用方法については、Enterprise COBOL プログラミング・ガイド」を参照してください。

クラス定義のためのリポジトリー項目については、REPOSITORY 段落を参照してください。例については、Enterprise COBOL プログラミング・ガイド」を参照してください。

COBOL と Java における各種の引数の型

以下の表では、INVOKE ステートメントの引数として使用可能な各種の COBOL 項目の例と、 それに対応する Java 型を示しています。

表 3. 各種の COBOL 引数のタイプとそれに対応する Java 型
COBOL 引数 対応する Java データ型
長さが 1 で USAGE DISPLAY の参照変更項目 byte
長さが 1 で USAGE NATIONAL の参照変更項目 (USAGE NATIONAL の基本データ項目または国別グループ項目のいずれか) char
SHIFT-IN および SHIFT-OUT 特殊レジスター byte
USAGE BINARY のときの LINAGE-COUNTER 特殊レジスター int
LENGTH OF 特殊レジスター int

以下の表には、INVOKE ステートメントの引数として使用可能な COBOL リテラルのタイプと、 それに対応する Java 型を示しています。

表 4. COBOL リテラル引数のタイプとそれに対応する Java 型
COBOL リテラル引数 対応する Java データ型
小数部の桁はなく、9 桁以下の固定小数点数字リテラル int
浮動小数点数字リテラル double
形象定数 ZERO int
1 文字の英数字リテラル byte
1 文字の国別リテラル char
シンボリック文字 byte
形象定数 SPACE、QUOTE、HIGH-VALUE、または LOW-VALUE byte

ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)