前へJava から Object COBOL を呼び出す ActiveX/Java 両用クラス次へ

第 5 章 Java データ型

Java データ型は COBOL データ型と異なります。この章では、COBOL データ型と Java データ型の相互のマップ方法について説明します。

5.1 概要

Java 言語では独自のデータ型を定義しており、COBOL で使用されるデータ型とは異なります。COBOL ランタイム システムは、次の図に示すように、COBOL から Java を呼び出す場合、または Java から COBOL を呼び出す場合に必ず、COBOL 型と Java 型の間で自動的に変換を行います。

COBOL と Java 間のデータのマッピング

図 4-1: データ型の変換

数字データ型は、COBOL プログラムが手続き型プログラムまたは Object COBOL のどちらの場合でも同じ方法で変換されます。オブジェクトおよび文字列は、手続き型 COBOL または Object COBOL のどちらを使用するかに応じて、異なる方法で変換されます。

Object COBOL は、Java オブジェクトを COBOL オブジェクト リファレンスとして処理しますが、手続き型 COBOL はポインタとして処理します。

5.2 Java データ型変換ルール

Java へ COBOL データを送る場合、COBOL データは適切な Java データ型に変換されます。同様に、Java プログラムが COBOL へ Java データを送り返す場合、Java データは COBOL データ型に変換されます。次の表には、Java と COBOL 間でデータが受け渡される際に行われる変換が定義されています。一部のデータ型は、手続き型 COBOL を使用している場合 (「Java から手続き型 COBOL を呼び出す」 の章を参照)、または Object COBOL Java ドメインを使用している場合 (「COBOL から Java を呼び出す」 の章、および「Java から Object COBOL を呼び出す」の章を参照) に応じて、異なる方法で処理されます。表中の COBOL の欄は、手続き型 COBOL に適用される変換規則を示し、Object COBOL の欄は、Object COBOL Java ドメインに適用される規則を示します。

簡単に使用できるように、コピーファイル javatypes.cpy に、Java データ型に対応する COBOL データ型のセットが定義されています。これらは、Java で使用するデータ項目を COBOL プログラムで宣言する際に短縮表記方法として使用することができます。短縮表記は、ユーザー定義型の欄に示されています。javatypes.cpy は、Net Express/source ディレクトリにあります。

Java ユーザー定義 COBOL Object COBOL 説明
byte jbyte pic s99 comp-5 pic s99 comp-5 1 バイトの符号付き整数
short jshort pic s9(4) comp-5 pic s9(4) comp-5 2 バイトの符号付き整数
int jint pic s9(9) comp-5 pic s9(9) comp-5 4 バイトの符号付き整数
long jlong pic s9(18) comp-5 pic s9(18) comp-5 by ref only 8 バイトの符号付き整数
boolean jboolean pic 99 comp-5 pic 99 comp-5 ゼロ値は偽、ゼロ以外は真
char jchar (Unicode) pic 9(4) comp-5 Java 中の文字はすべて 2 バイトの Unicode 文字として表現されます。
float jfloat comp-1 comp-1 (Unix では by ref のみ) 浮動小数点数型
double jdouble comp-2 comp-2 by ref のみ 倍精度浮動小数点数型
String mf-jstring ポインタ pic x(n) mf-jstring は、文字列またはバッファのアドレス、サイズおよび容量を与えるユーザー定義型です。String では、容量は常にゼロです。COBOL プログラムへ渡される文字列は、読み取り専用であり修正できないと考える必要があります。StringBuffer では、容量はバッファの合計サイズ、サイズは現在バッファに保持されている文字列の長さです。
StringBuffer
objects ポインタ オブジェクト リファレンス 任意の Java オブジェクト。手続き型 COBOL へ戻されたポインタは JNI 呼び出しで使用できます (「Java から手続き型 COBOL を呼び出す」の章の 「COBOL で JNI を使用する」 を参照)。
object[] ポインタ クラス jarray のインスタンスへのオブジェクト リファレンス Java オブジェクトの配列。手続き型 COBOL へ戻されたポインタは JNI 呼び出しで使用できます (「Java から手続き型 COBOL を呼び出す」 の章の 「COBOL で JNI を使用する」を参照)。jarray は、Java 配列の内容にアクセスするための Object COBOL クラスです。「Jarrays の使用」 の項を参照してください。

5.3 Jarrays の使用

jarray クラスは、Java 配列を操作するための Object COBOL ラッパーを提供します。詳細は、「Java ドメイン クラス ライブラリ リファレンス」に説明されています。 Windowsの[スタート]メニューの[プログラム]から、Net Expressのフォルダ内の[NetExpress オンラインマニュアル] を選択して、「クラス ライブラリ リファレンス」 のショートカット ボタンをクリックします。

次の COBOL プログラムは、Java オブジェクトから配列を受け取り、次元を検出して、配列の内容を表示します。

$set ooctrl(+p-f)
 Program-id. ReadArray.
 class-control.
     arraydemo is class "$Java$arraydemo"
     .

 thread-local-storage section.
 01 aJavaObj             object reference.

 01 theTotal        pic 9(9).
 01 CDims           pic x(4) comp-5.
 01 Dims.
   03 Dims-entry    pic x(4) comp-5 occurs 256.
 01 Bounds.
   03 Bounds-entry  pic x(4) comp-5 occurs 256.
 01 ind0            pic x(4) comp-5.
 01 ind1            pic x(4) comp-5.
 01 arrayElement    pic x(4) comp-5.
 01 wsTable         object reference.
 01 wsResult        pic x(4) comp-5.

 procedure division.
   invoke arraydemo "new" returning aJavaObj
   invoke aJavaObj "getArray" returning wsTable

*> 配列中の要素数を検出
     invoke wsTable "getDimensions" returning CDims
     display "The array has " CDims " dimension(s)"

*> 各次元中の要素数を取得
     display "dimensions are " with no advancing
     invoke wsTable "getBounds" using Bounds
     perform varying ind0 from 1 by 1 until ind0 > CDims
          display Bounds-entry(ind0) with no advancing
          if ind0 < CDims
             display " by " with no advancing
          end-if
     end-perform
     display " "

*> 配列中の各要素を表示
     perform varying ind0 from 0 by 1
             until ind0 = Bounds-entry(1)
         move ind0 to Dims-entry(1)
         perform varying ind1 from 0 by 1
                   until ind1 = Bounds-entry(2)
             move ind1 to Dims-entry(2)
             invoke wsTable "getElement" using
                                  by value CDims
                                  by reference Dims
                                  by reference arrayElement
             display "Element " ind0 ","
                   ind1 " is " arrayElement
*> 配列の内容を変更
             add 50 to arrayElement
             invoke wsTable "putElement" using
                                   by value CDims
                                   by reference Dims
                                   by reference arrayElement
         end-perform
     end-perform

次は、ReadArray に使用される Java arraydemo クラスの実装です。このプログラムは 2 次元の配列を作成します。

import mfcobol.*;
import java.io.*;

public class arraydemo extends runtime
{
    int myArray[][];

    public arraydemo()
    {
        myArray = new int[5][2];
        int i,j;
        for (i = 0; i < 5; i++)
        {
            for (j = 0; j < 2; j++)
                myArray[i][j] = i * 100 + j;
        }
    }

    public Object[] getArray()
    {
        int i,j;
        Object[] params = myArray;
        return params ;
    }
}


Copyright © 2000 MERANT International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前へJava から Object COBOL を呼び出す ActiveX/Java 両用クラス次へ