Java コードの ExternalType

JavaObject ステレオタイプが指定された ExternalType パーツは、外部 Java™ クラスまたはインターフェースに EGL コードからアクセスする方法を定義します。 このパーツは通常、クラスまたはインターフェースのすべての公開フィールド、メソッド、およびコンストラクターを示していますが、一部の対象を示す場合もあります。

構文

外部型の構文図
name
外部型の名前
ExternalType
ExternalType が Java クラスを表すかまたはインターフェースを表すかに応じて、現在の外部型による拡張または実装となる外部型。 定義される外部型には、ExternalType からのフィールドおよび関数プロトタイプが組み込まれていますが、コンストラクター・プロトタイプは組み込まれていません。

EGL は Serializable 外部型を事前定義します。これは java.io.Serializable インターフェースを実装する Java クラスに基づく外部型を定義する場合に参照できます。 定義する外部型が EGL Serializable 外部型を拡張しない場合、その外部型に基づくすべての EGL 変数は、生成される Java コードでは「一時的」とマークが付けられます。 一時変数は、Java オブジェクトがアプリケーション・サーバーなどのランタイム・プラットフォームにより直列化されるときには保存されません。 例えば、直列化は、シャットダウンに応じてサーバーがオブジェクトのバックアップ・コピーを作成する場合に行われることがあります。

property
選択可能なパーツ・レベル・プロパティーは、以下のとおりです。
packageName
外部 Java クラスのパッケージ名を保持するストリング。
javaName
Java クラス名を保持するストリング。 このプロパティーはオプションであり、デフォルトでは外部型の名前になります。 ただし、場合によっては (例えばクラス名が EGL 予約語である場合など) カスタム型名を指定する必要があります。そのような場合は、javaName プロパティーを指定する必要があります。
static
変数または関数がクラスに対してグローバルであり、クラスにオブジェクトがあるかどうかには依存していないことを示す標識。 オブジェクトを参照しない外部型の参照によって (例えば MyType.theStaticVariable)、またはオブジェクトの参照によって (例えば MyObject.theStaticVariable)、静的変数または関数にアクセスすることができます。
constructorPrototype
Java コンストラクターに対応する EGL 関数プロトタイプ。 以下の種類のパラメーターを渡すことができます。
  • プリミティブ型の値。 in 修飾子を指定する必要があります。
  • 動的配列。 inout、または inout 修飾子を指定できます。
  • 構造化レコード。inout 修飾子を指定する必要があります。
functionPrototype
Java メソッドに対応する EGL 関数プロトタイプ。 以下の種類のパラメーターを渡すことができます。
  • プリミティブ型の値。 in 修飾子を指定する必要があります。
  • 動的配列。 inout、または inout 修飾子を指定できます。
  • 構造化レコード。inout 修飾子を指定する必要があります。

この関数は、プリミティブ型値または配列を返すことができます。あるいは値をまったく返さない場合もあります。 この関数はレコードは返すことができません。

variableList
EGL 変数、または EGL 変数のコンマ区切りリスト。 各 EGL 変数は Java フィールドに対応し、Java プリミティブ、EGL 外部型、またはプリミティブあるいは外部型の配列に基づくものにすることができます。
変数宣言または関数宣言には、以下のプロパティーを組み込むことができます。
JavaName
Java クラスの関連フィールドまたはメソッドの名前が含まれるストリング。 このプロパティーはオプションであり、デフォルトでは外部型の変数または関数の名前になります。 ただし、場合によっては (例えばフィールド名が EGL 予約語である場合など) カスタム名を指定する必要があります。そのような場合は、JavaName プロパティーを指定する必要があります。 以下に例を示します。
Function nextElement() { JavaName = "next" };

変数宣言には、以下のプロパティーを組み込むこともできます。

@JavaProperty
@JavaProperty は、生成されたコードのフィールド・アクセスが、フィールドへの直接アクセスによってではなく、メソッド呼び出しによって提供されることを示します。 このプロパティーは、関数の名前が、語「get」または「set」に変数名を続ける形式で作成される場合に、関数名を指定せずに使用できます。 例えば、変数 UpperLimit および Java クラスに getUpperLimit および setUpperLimit という名前の関数が組み込まれている場合、以下の例に示すように、複合プロパティーを追加するだけで済みます。
UpperLimit INT { @JavaProperty{} };
@JavaProperty のプロパティー・フィールドは、以下のとおりです。
getMethod
指定された変数の get メソッドの名前を含むストリング (小括弧は含まれません)。 メソッドはパラメーターを持たず、その戻り値はフィールドと同じ型になります。
setMethod
指定された変数の set メソッドの名前を含むストリング (小括弧は含まれません)。 メソッドは型がフィールドと同じパラメーターを 1 つ持ちます。 規則により、set メソッドには戻り値はありませんが、メソッドが値を戻してもエラー状態にはなりません。

getMethod が指定されているが setMethod が指定されていない場合、フィールドは読み取り専用になり、setMethod が定義されているが getMethod が定義されていない場合、フィールドは書き込み専用になります。 読み取り専用フィールドの値を設定しようとしたり、書き込み専用フィールドの値を取得したりしようとすると、エラーが発生します。

@eventListener
@eventListener 複合プロパティーにより、ユーザーまたはユーザーの同僚は Java 環境向けのイベント・ハンドラーを作成し、EGL ジェネレーターに Java イベント・リスナー・パターンに準拠するコードを作成するために必要な情報を指定できます。

例えば、java.beans パッケージについて考慮してみましょう。これは Java 開発者が、一般に Java Bean、または単に Bean として知られている、一種の Java クラスのコーディングに使用するものです。 機能の 1 つとして、Bean はランタイム・イベントに応じて Java オブジェクトのメソッドを呼び出すことができます。 この説明の残りの部分では、ランタイム・イベントは Bean のプロパティー値の変更であると想定しています。 .

Java デベロッパーは、そのイベントのタイプを、Bean の addPropertyChangeListener メソッドを呼び出し、PropertyChangeListener オブジェクトを渡すことによって登録します。 一般的な表現で言えば、PropertyChangeListener オブジェクトはイベント・ハンドラー です。

プロパティー値を変更した後に、Bean はイベント・リスナーを呼び出します。 特に、Bean は PropertyChangeListener オブジェクトの propertyChange メソッドを呼び出し、変更に関する詳細を提供する PropertyChangeEvent オブジェクトを渡します。

詳細とは、イベント・リスナーが Java インターフェースに基づいており、propertyChange メソッドがビジネス・アプリケーションに固有であるということです。 EGL デベロッパーが @eventListener プロパティーを使用するということは、EGL 生成の propertyChange メソッドが、デベロッパーがコーディングした EGL 関数から派生するロジックを呼び出すことを意味します。

これらの詳細に留意し、@eventListener プロパティーの以下のプロパティー・フィールドについて考慮しましょう。
addMethod
イベント・リスナーを登録する Java メソッドの名前を含むストリング。 メソッドを示す場合には括弧を含めないでください。

現在の例では、addMethod の値は「addPropertyChangeListener」です。

listenerType
リスナーとして機能する Java クラスの名前を含むストリング。 そのクラスのパッケージ名を組み込みます。

現在の例では、listenerType の値は「java.beans.PropertyChangeListener」です。

method
リスナーにあり、イベントの発生時に呼び出される Java メソッドの名前を含むストリング。

現在の例では、method の値は「propertyChange」です。

MyBean という Bean の外部型を定義する EGL コードについて考慮してみましょう。 この外部型には、onPropertyChange というフィールドが組み込まれています。これは後述の委譲パーツに基づいています。
ExternalType MyBean type JavaObject
   onPropertyChange PropertyChangeDelegate
      { @eventListener{ addMethod = "addPropertyChangeListener", 
                        listenerType = "java.beans.PropertyChangeListener", 
                        method = "propertyChange" } };
end

onPropertyChange フィールドは Bean 内にありませんが、存在しており、リスナー・パターンは EGL コードで入手可能です。そこではイベントの発生時に呼び出される EGL 関数を割り当てます。

propertyChange メソッドに合わせて、PropertyChangeDelegate 委譲パーツには単一のパラメーターがあります。これは PropertyChangeEvent オブジェクトに基づく外部型です。
Delegate PropertyChangeDelegate( evt PropertyChangeEvent in ) 
end

ExternalType PropertyChangeEvent type JavaObject { packageName = "java.beans" }
   function getPropertyName() returns ( string );
   // You might make available other methods of java.beans.PropertyChangeEvent.
end
MyBean 外部型の使用法を確認するために、以下の EGL プログラムを考慮してみましょう。
program MyEGLProgram
   function main()
      mb MyBean{ onPropertyChange = propChange };
   end

   function propChange( evt PropertyChangeEvent in )
      writeStdout( "Property " :: evt.getPropertyName() :: " has changed." );
   end
end

このプログラムは、タイプ MyBean の変数を作成し、関数をそのタイプの onPropertyChange フィールドに割り当て、関数自体を定義します。 Bean 内でプロパティー値が変更されると、関数が呼び出され、getPropertyName が使用されます。これは PropertyChangeEvent オブジェクトから使用可能にされた 1 メソッドです。

@eventListener プロパティーは必ず、委譲パーツに基づく変数に割り当てます。 委譲パーツの特性は、propertyChange などのイベント処理メソッドに準拠する必要があります。これは PropertyChangeListener などの特定の Java イベント・リスナー内にあります。

コード内の Java フィールドとメソッド名を参照する場合は、同等の EGL 名であるとしてもそうでないとしても、それらは大/小文字を区別することに留意してください。


フィードバック