COBOLからJavaへの移行で必ず話題になるのが COPY句の扱い です。
特に、
「COPY句=固定長ファイル定義では?」
と認識している方も少なくありません。
この記事ではまず その誤解を整理した上で、
COBOLのCOPY句を Javaでどう置き換えるべきか を
設計パターン別にまとめます。
【注意事項】COPY句は「固定長ファイル定義専用」ではない
よくある認識
COPY句は固定長ファイルを定義するもの
正確な理解
COPY句は 外部ファイルのコードを展開する仕組み
つまり COPY句そのものは、
-
固定長ファイル定義
-
ワーク領域定義(WS)
-
定数・コード値
-
共通処理ロジック
すべてに使える構文 です。
なぜ「固定長ファイル」という印象が強いのか?
理由は実務上とてもシンプルです。
-
固定長レコードは 1バイトでもズレると致命的
-
読み/書き/検証で 完全一致が必須
-
人が毎回書くのは危険
そのため、
という COPYBOOK文化 が広く定着しました。
👉 結果として
「COPY句=固定長ファイル」
というイメージが強く残っています。
Java移行時に重要な考え方
❌ COPY句の形をJavaで再現しようとする
⭕ COPY句が「何を定義していたか」を見極める
これが、設計の分かれ目になります。
COPY句の役割別に見る Java置き換え設計パターン
パターン①:定数・コード値のCOPY句 → 定数クラス
COBOL(例)
|
1 2 3 |
01 STATUS-OK PIC 9 VALUE 0. 01 STATUS-ERROR PIC 9 VALUE 9.<code class="whitespace-pre! language-cobol"> |
Java
|
1 2 3 4 5 6 7 |
public final class StatusConstants { private StatusConstants() {} public static final int OK = 0; public static final int ERROR = 9; } |
ポイント
-
enumより 定数クラスが移行向き
-
状態は持たせない
-
名前で意味を表す
パターン②:データ定義(COPYBOOK)→ DTO / POJO
COBOL
|
1 2 3 4 |
01 WS-EMPLOYEE. 05 EMP-ID PIC 9(6). 05 EMP-NAME PIC X(20).<code class="whitespace-pre! language-cobol"> |
Java
|
1 2 3 4 5 6 7 |
public class EmployeeDto { private int empId; private String empName; // getter / setter } |
ポイント
-
1 COPYBOOK = 1 DTO が基本
-
固定長という制約はDTOに持たせない
-
業務データとして再定義する
パターン③:【重要】固定長ファイルCOPY句の正しい分解
❌ よくある誤り
-
固定長前提のクラスを作る
-
桁位置ロジックをDTOに埋め込む
⭕ 正しい分解
① 業務データ
|
1 2 3 4 5 |
public class Employee { private int id; private String name; } |
② 固定長レコード変換専用クラス
|
1 2 3 4 5 6 |
public class EmployeeFixedLengthMapper { public Employee parse(String record) { // 桁位置で切り出す } } |
👉
レコード構造と業務データを分離するのがJava的設計です。
パターン④:計算・処理系COPY句 → Utilityクラス
COBOL
|
1 2 |
COMPUTE WS-TAX = WS-AMOUNT * 0.1.<code class="whitespace-pre! language-cobol"> |
Java
|
1 2 3 4 5 6 7 8 |
public final class TaxUtil { private TaxUtil() {} public static BigDecimal calcTax(BigDecimal amount) { return amount.multiply(BigDecimal.valueOf(0.1)); } } |
ポイント
-
状態を持たない
-
単体テストしやすい
-
WS直接操作は避ける
パターン⑤:状態判定・業務判断COPY句 → Service
COBOL
|
1 2 3 4 |
IF WS-STATUS = 9 MOVE 1 TO WS-ERROR-FLG END-IF.<code class="whitespace-pre! language-cobol"> |
Java
|
1 2 3 4 5 6 |
public class StatusCheckService { public boolean isError(int status) { return status == 9; } } |
ポイント
-
判断ロジックを明確化
-
将来の仕様変更に強い
-
DIと相性が良い
パターン⑥:段階移行用(注意して使う)
|
1 2 3 4 5 |
public class WsEmployee { public int empId; public String empName; } |
注意点
-
移行初期専用
-
Javaらしさは捨てる
-
最終形にしない
COPY句 → Java設計 早見表
| COPY句の役割 | Javaでの置き換え |
|---|---|
| 定数・コード | 定数クラス |
| 業務データ | DTO / POJO |
| 固定長レコード | Mapper / Converter |
| 計算処理 | Utility |
| 状態判定 | Service |
| 移行初期 | 1COPY=1クラス |
よくあるアンチパターン(注意)
-
COPY句をすべてstaticクラスにする
-
固定長の桁位置をDTOに埋め込む
-
巨大な共通クラスを作る
-
COPY句の感覚をJavaに持ち込む
まとめ
-
COPY句は 固定長ファイル専用ではない
-
Java移行では COPY句の「役割」を見極める
-
固定長ファイルは 構造と業務データを分離
-
「再現」より「再設計」が重要
COBOLのCOPY句をどうJavaに置き換えるかは、
移行後の保守性・拡張性を決定づける設計ポイントです。

