パーツの解決規則では、EGL がパーツ名を検索し、プログラム内で参照を解決する方法を定めています。
これは、式におけるネーム解決で説明されている、式で名前を解決するための検索とは異なったプロセスです。
パーツの解決規則は、次のものに適用されます。
- パーツを基にした変数、フィールド、またはパラメーター宣言
- use 文
- 名前をフィールドまたは関数として解決できない式
- パーツを参照するプロパティー
パーツの解決には、以下の 3 つの重要な概念があります。
- EGL_ROOT
- EGL_ROOT は、EGL とともに出荷されるすべてのパーツを保持している論理コンテナーです。
- EGL ビルド・パス
- EGL ビルド・パスは、プロジェクト間の可視性を制御しますが、EGL がパーツ名を解決しようとする際の検索順序も定めます。
EGL_ROOT は、暗黙的にパスの最後に追加されます。
詳しくは、「EGL プログラマー・ガイド」の『EGL ビルド・パス』を参照してください。
- システム有効範囲
- システム有効範囲には、インポートまたは完全修飾しなくても解決可能な EGL パーツのセットが含まれています。
現在、EGL_ROOT の中にあるのは、システム有効範囲に含まれるパーツのみです。
システム有効範囲を使用すると、システム・パーツ (レコード sqlLib.sqlData など) を、
修飾子または import 文を使用せずに参照できるようになります。
mySQLDataVar sqlData;
完全修飾パーツ名を解決する場合、EGL はビルド・パス上の各項目を検索し、指定のパッケージおよびパーツが含まれているか確認します。
EGL ビルド・パス上で検出された最初のパーツが使用されます。
非修飾のパーツ名を解決する場合、EGL は次のものに優先順位を付けます (順位順に説明します)。
- 単一パーツのインポート
- EGL はまず、ソース・ファイル内にある単一パーツの import 文を確認して、名前を解決しようとします。
例えば、次の import 文は、名前 myLibrary を解決します。
import com.companyb.gl.myLibrary;
- デフォルトのパッケージからパーツをインポートすることはできません。
- 現行パッケージ
- 単一パーツのインポートを確認した後、EGL は現行パッケージの残りの部分について名前がないか確認します。
例えば、上記のステップが失敗した場合、現行パッケージのパーツとして myLibrary という名前のライブラリーがあれば、EGL はそのライブラリーを使用して参照を解決します。
- オンデマンドのインポート
- EGL は、EGL ビルド・パスにある全プロジェクトについて順番に、そのオンデマンド import 文に各パッケージがないか検索していきます。
一致するパッケージがあった場合、EGL はそのパッケージに一致するパーツがないか検索します。
その一致したパッケージにパーツがない場合、
EGL は引き続き EGL ビルド・パス上で、同じ名前を持つ別のパッケージがないか検索していきます。
- EGL は、このステップの間に、ソース・ファイル内のすべてのオンデマンド import 文を読み取ります。
複数のオンデマンド import 文が同じパーツ名を解決している場合、EGL はその名前に未確定のマークを付けます。1 つ以上のオンデマンド import 文を、
単一パーツの import または完全修飾パーツ名に置き換えて、この競合を解決してください。
- com.companyb.payroll パッケージに myLibrary があった場合、
次のコードを使用すると、EGL によってその名前を解決できます。
import com.companyb.payroll.*;
- デフォルトのパッケージからパーツをインポートすることはできません。
- システム有効範囲
- 前記のいずれのステップでもパーツ名を解決できない場合にのみ、EGL は、システム有効範囲内で一致するパーツを検索します。