Java と RPG についての概要

Java(TM) プログラム言語は、Sun Microsystems によって開発された高水準オブジェクト指向言語です。Java プログラムは、WebSphere Development Studio for iSeries のVisualAge(R) for Java コンポーネントを使用して開発することができます。

オブジェクト指向プログラミングにおいては、「メソッド」は「クラス」の一部として定義される、プログラム済みのプロシージャーです。 「クラス」とはメソッドと変数の集まりです。Java メソッドをユーザーの RPG プログラムから呼び出すことができます。ほとんどの Java メソッドは Java で書かれていますが、RPG などの他の高水準言語でメソッドを書くこともできます。これを「ネイティブ・メソッド」と呼びます。 当セクションには、RPG から Java メソッドを呼び出したり、RPG ネイティブ・メソッドを書いたりするための情報があります。

オブジェクト・データ・タイプおよび CLASS キーワード

オブジェクトを保管できるフィールドは、O データ・タイプを使って宣言します。タイプ O のフィールドを宣言するには、D 仕様書の 40 桁目 に O をコーディングし、オブジェクトのクラスを提供する CLASS キーワードを 使用します。CLASS キーワードは次のとおり 2 つのパラメーターを受け入れます。

CLASS(*JAVA:class_name)

*JAVA はオブジェクトが Java オブジェクトであることを示します。Class_name は、オブジェクトのクラスを指定するもので、文字リテラルまたは名前の付いた固定情報でなければならず、かつクラス名は完全修飾されている必要があります。 クラス名では、大文字と小文字が区別されます。

例えば、タイプ BigDecimal のオブジェクトを保持するフィールドを宣言するには、次のようにします。

D bdnum           S               O   CLASS(*JAVA:'java.math.BigDecimal')

タイプ String のオブジェクトを保持するフィールドを宣言するには、次のようにします。

D string          S               O   CLASS(*JAVA:'java.lang.String')

どちらのクラス名も完全に修飾されていること、および大文字小文字が Java クラスの大文字小文字と正確に一致していることに注意してください。

タイプ O のフィールドをデータ構造のサブフィールドとして定義することはできません。タイプ O のフィールドを持つ配列を定義することはできますが、タイプ O の実行時テーブルとコンパイル時テーブル、および実行時配列とコンパイル時配列は許されません。

Java メソッドのプロトタイピング

サブプロシージャーと同様に、Java メソッドも正確に呼び出すためにプロトタイプされる必要があります。ILE RPG コンパイラーは、メソッドの名前、所属するクラス、パラメーターのデータ・タイプと戻り値のデータ・タイプ、およびそのメソッドが静的メソッドであるかそうでないかを知る必要があります。

拡張された EXTPROC キーワードを使用して、メソッドの名前と所属するクラスを指定することができます。 Java メソッドのプロトタイピングの場合、EXTPROC キーワードの正しい形式は次のとおりです。

EXTPROC(*JAVA:class_name:method_name)

クラス名もメソッド名も、ともに文字定数であることが必要です。クラス名は完全に修飾された Java クラス名でなければならず、大文字小文字の区別があります。 メソッド名は呼び出されるメソッドの名前でなければならず、大文字小文字の区別があります。

プロトタイプを作成するときは、Java で書かれるメソッドでも RPG で書かれるネイティブ・メソッドでも、いずれの場合も *JAVA を使用します。STATIC キーワードは、メソッドが静的であることを示すために使用します。

Java と RPG 定義とデータ・タイプ

メソッドのパラメーターと戻り値のデータ・タイプは、サブプロシージャーのプロトタイピングの時と同様に指定します。 ただしデータ・タイプは、実際は Java データ・タイプにマップされます。次の表は、ILE RPG データ・タイプと Java データ・タイプとの対応表です。

表 30.
Java データ・タイプ ILE RPG データ・タイプ RPG 定義
boolean 標識 N
byte1 整数 3I 0
文字 1A
byte[] 文字の長さ > 1 (3 を参照) nA
文字の長さ = 1 の配列 (4 を参照) 1A DIM(x)
日付 D
時刻 T
タイム・スタンプ Z
short 2 バイト整数 5I 0
char UCS-2 長さ = 1 1C
char[] UCS-2 の長さ > 1 (3 を参照) nC
UCS-2 の長さ = 1 の配列 (4 を参照) 1C DIM(x)
int 4 バイト整数 10I 0
long 8 バイト整数 20I 0
float 4 バイト浮動 4F
double 8 バイト浮動 8F
any object オブジェクト O CLASS(x)
any array 同等タイプの配列 (4 を参照) DIM(x)
注:
  1. Java byte タイプが文字 (1A) との間で変換される時は、ASCII 変換が行なわれます。Java byte タイプが整数 (3I) データ・タイプとの間で変換される場合は、ASCII 変換は行なわれません。
  2. Java でいかなるタイプを持つ配列の場合も、RPG で同等タイプの配列を定義することができますが、文字で長さが 1 より大きいか、または UCS-2 で長さが 1 より大きいデータ・タイプの配列は使用できないことに注意してください。
  3. UCS-2 で長さが 1 より大きいデータ・タイプおよび文字で長さが 1 より大きいデータ・タイプの場合、VARYING キーワードを使用することができます。Java byte[] および char[] は固定長で宣言することはできないため、一般的に VARYING キーワードの使用をお勧めします。
  4. Java 配列は固定長で宣言できないため、RPG の配列データ・タイプでは配列パラメーターとして一般に OPTIONS(*VARSIZE) をコーディングする必要があります。

ゾーン、パック、2 進、および符号なしのデータ・タイプは Java では使用できません。ゾーン、パック、2 進、または符号なしのフィールドをパラメーターとして 渡した場合、コンパイラーは適切な変換を行ないます。ただしその結果として、 切り捨てが行なわれるかまたは精度が失われる (あるいはその両方) 可能性があります。

メソッドを呼び出す際、コンパイラーが配列をパラメーターとして受け入れるのは、そのパラメーターが DIM キーワードを使用してプロトタイプされている場合のみです。

メソッドの戻り値またはパラメーターがオブジェクトである場合、プロトタイプに CLASS キーワードをコーディングすることにより、そのオブジェクトのクラスを提供する必要があります。 指定されたクラス名は、オブジェクトが戻されたりパラメーターが渡されたりするクラス名に なります (呼び出されるメソッドのクラスを指定するには、EXTPROC キーワードを使用します)。

メソッドを静的メソッドとして呼び出そうとしている場合は、プロトタイプに STATIC キーワードを指定する必要があります。メソッドがコンストラクターである場合は、 *CONSTRUCTOR をメソッドの名前として指定する必要があります。

Java では、値として渡すことができるのは以下のデータ・タイプのみです。

boolean
byte
int
short
long
float
double

これらのタイプのパラメーターは、プロトタイプで VALUE キーワードを指定する必要があります。

オブジェクトは参照によってのみ、渡すことができることに注意してください。VALUE キーワードはタイプ O と一緒に指定することはできません。配列は Java からはオブジェクトとして見なされるため、配列へのパラメーター・マッピングも参照によって渡される必要があります。これには 文字配列およびバイト配列も含まれます。CONST キーワードが使用できます。

Java メソッドのプロトタイピングの例

この節では、Java メソッドのプロトタイピングの例をいくつか説明します。

例 1

Java Integer クラスには、toString と呼ばれる静的メソッドがあり、このメソッドは int パラメーターを受け取って String オブジェクトを戻します。これは、Java では次のように宣言されます。

static String  Integer.toString(int)

このメソッドは次のようにプロトタイプされます。

D tostring        PR              O   EXTPROC(*JAVA:
D                                      'java.lang.Integer':
D                                      'toString')
D                                     CLASS(*JAVA:'java.lang.String')
D                                     STATIC
D    num                        10I 0 VALUE

EXTPROC キーワードが、このメソッドが Java メソッドであることを示します。 また、メソッド名が「toString」で、「java.lang.Integer」というクラスにあることも示しています。

40 桁目の O と CLASS キーワードは、このメソッドがオブジェクトを戻すこと、およびそのオブジェクトのクラスが「java.lang.String」であることをコンパイラーに伝えます。

STATIC キーワードは、このメソッドが静的メソッドであること、つまり このメソッドを呼び出すために Integer オブジェクトは必要ではないことを示します。

パラメーターのデータ・タイプは 10I と指定されており、これは Java の int データ・タイプにマップします。パラメーターが int であるため、これは値として渡されなければならず、VALUE キーワードが必要です。

例 2

Java Integer クラスには、getInteger と呼ばれる静的メソッドがあり、このメソッドはパラメーターとして String オブジェクトおよび Integer オブジェクトを受け取り、Integer オブジェクトを戻します。これは、Java では次のように宣言されます。

static Integer Integer.getInteger(String, Integer)

このメソッドは次のようにプロトタイプされます。

D getint          PR              O   EXTPROC(*JAVA:
D                                      'java.lang.Integer':
D                                      'getInteger')
D                                     CLASS(*JAVA:'java.lang.Integer')
D                                     STATIC
D   string                        O   CLASS(*JAVA:'java.lang.String') CONST
D   num                           O   CLASS(*JAVA:'java.lang.Integer') CONST

このメソッドは 2 つのオブジェクトをパラメーターとして受け取ります。D 仕様書の 40 桁目には O がコーディングされ、CLASS キーワードが各オブジェクト・パラメーターのクラスを指定します。どちらのパラメーターも入力専用なので、CONST キーワードが指定されます。

例 3

Java Integer クラスには shortValue と呼ばれるメソッドが含まれており、このメソッドは自分自身の呼び出しのために使用された Integer オブジェクトの短縮表記を戻します。これは、Java では次のように宣言されます。

short shortValue()

このメソッドは次のようにプロトタイプされます。

D shortval        PR             5I 0 EXTPROC(*JAVA:
D                                      'java.lang.Integer':
D                                      'shortValue'

このメソッドは静的メソッドでないため、STATIC キーワードは指定しません。このメソッドはパラメーターを取らないため、何もコーディングされていません。 このメソッドを呼び出す際に、ユーザーが最初のパラメーターとして Integer インスタンスを指定します。 戻り値は 5I と指定されており、これは Java short データ・タイプにマップされます。

例 4

Java Integer クラスには、equals と呼ばれるメソッドがあり、 このメソッドはパラメーターとして Object を受け取って boolean を戻します。これは、Java では次のように宣言されます。

boolean equals(Object)

このメソッドは次のようにプロトタイプされます。

D equals          PR              N   EXTPROC(*JAVA:
D                                      'java.lang.Integer':
D                                      'equals')
D  obj                            O   CLASS(*JAVA:'java.lang.Object')

戻り値は N と指定されており、これは Java boolean データ・タイプにマップされます。これは静的メソッドではないため、このメソッドへの呼び出しには 2 つのパラメーターがあり、インスタンス・パラメーターが最初にコーディングされます。