クラス定義の FACTORY 段落の PROCEDURE DIVISION に COBOL ファクトリー・メソッド を定義します。ファクトリー・メソッドは、クラスの どのオブジェクト・インスタンスとは無関係に、クラスによってサポートされる操作を定義します。COBOL ファクトリー・メソッドは Java public 静的メソッドと同じです。
一般的には、そのインスタンスが複雑な初期化を必要とするクラスについて、すなわち、VALUE 節だけの使用では割り当てることができない値に対して、ファクトリー・メソッドを定義します。ファクトリー・メソッド内でインスタンス・メソッドを呼び出して、インスタンス・データを初期化することができます。ファクトリー・メソッドは、インスタンス・データに直接アクセスする ことはできません。
ファクトリー属性 (get および set) メソッドをコーディングして、FACTORY 段落の外側からファクトリー・データにアクセス可能にすることができます。例えば、同じクラスのインスタンス・メソッドから、またはクライアント・プログラムからファクトリー・データにアクセス可能にすることができます。例えば、Account クラスはファクトリー・メソッド getNumberOfAccounts を定義して、口座数の現在の集計を戻すことができます。
ファクトリー・メソッドを使用して、Java プログラムからアクセス可能に なるようにプロシージャー指向の COBOL プログラムをラップすることもできます。main という名前のファクトリー・メソッドをコーディングすることで、java コマンドを使用してオブジェクト指向アプリケーションを実行したり、Java の標準的な方法に従ってアプリケーションを構成したりすることができます。詳細については、関連タスクを参照してください。
ファクトリー・メソッドの定義では、インスタンス・メソッドを定義するときに用いる構文と同じ構文を使用します。COBOL ファクトリー・メソッド定義は、4 つの部 (COBOL プログラムに類似) と その後の END METHOD マーカーから構成されます。
| 除算 | 目的 | 構文 |
|---|---|---|
| IDENTIFICATION (必須) | クラス・インスタンス・メソッドの場合と同じ | クラス・インスタンス・メソッドの場合と同じ (必須) |
| ENVIRONMENT (オプション) | クラス・インスタンス・メソッドの場合と同じ | クラス・インスタンス・メソッドの場合と同じ |
| DATA (オプション) | クラス・インスタンス・メソッドの場合と同じ | クラス・インスタンス・メソッドの場合と同じ |
| PROCEDURE (オプション) | クラス・インスタンス・メソッドの場合と同じ | クラス・インスタンス・メソッドの場合と同じ |
クラス定義内では、各ファクトリー・メソッド名を固有にする必要はありませんが、各ファクトリー・メソッドに固有のシグニチャーを与える必要があります。ファクトリー・メソッドの多重定義は、インスタンス・メソッドを多重定義する場合とまったく同じ方法で行うことができます。例えば、CheckingAccount サブクラスは、2 つの版のファクトリー・メソッド createCheckingAccount、すなわち、口座を 初期化してデフォルトの収支ゼロを設定する版と、開始残高を渡せるようにする版を提供します。クライアントは、意図したメソッドのシグニチャーと一致する引数を渡して、createCheckingAccount メソッドのいずれかを呼び出すことができます。
ファクトリー・メソッドの DATA DIVISION および FACTORY 段落の DATA DIVISION の両方において、データ項目を同じ名前で定義した場合、そのデータ名に対するメソッド内の参照は、そのメソッド・データ項目だけ を参照します。メソッド DATA DIVISION が優先します。