ジェネレーションギャップパターンの意外な有用性

※このエントリは、以前ライブドアブログで書いたものを一部修正して移動したものです


ジェネレーションギャップパターンというデザインパターンがある
このデザインパターンを利用していて、意外な有用性を感じたので記録として

ジェネレーションギャップパターンはソースの自動生成を行う際に適用するもの
自動生成したソースを編集せず、そのサブクラスを作って編集することにより、自動生成するソースに仕様変更が発生した場合も、編集した箇所が消えない

例えば自動生成したソースを編集していたとしよう
自動生成するソースに仕様変更が発生して、再度自動生成しなければならなくなったとする。
再度自動生成すると、編集していた箇所が0に戻るのだ。今まで編集していた箇所をすべてマージする必要が出てくる
でもサブクラスを編集していれば、親クラスが変更されるだけでマージの必要はない

そういうパターン
でも今回はさらなる有用性を感じた
仕事で下記のような内容のコーディングを行うことになった

                                        • -

作業▽
ソースの自動生成ツールの改修

内容▽
(自動生成した)とあるクラスをインスタンスした際、確実に、ある処理を行わせる

条件▽
1.開発者(自動生成したソースを利用して実際にコーディングを行う人)にはその処理を意識させない
 →その処理を行っていることを知らなくてもよい

2.開発者は自動生成したクラスを元にコーディングを行う
 →つまり、処理の追加・変更があり得る

                                        • -

内容だけを見ると、コンストラクタに定義すればよくね?って感じだけど、条件によりボツ
条件2により、コンストラクタをユーザがオーバーロードする可能性がある
コンストラクタをオーバーロードする場合、その処理を確実に記述するというルールを設定すればよいけど、忘れるかもしれないし、条件1に反する
品質低下の基だし

この場合、ジェネレーションギャップパターンを利用していると簡単
Javaには、「子クラスのコンストラクタは、暗黙で親クラスのコンストラクタを呼び出す」という仕様がある(オブジェクト指向言語ではそうなのかな?)
つまり、super()が暗黙で呼び出されている
ということは、自動生成するクラスのデフォルトコンストラクタに定義した処理は、子クラスのすべてのコンストラクタから呼び出される
しかも暗黙でだ

確実に行わせたい処理をここに記述し、ジェネレーションギャップパターンを適用すれば、ユーザが何も意識しなくても、「とあるクラスをインスタンスした際、確実に、ある処理を行わせる」ことが可能になる
ユーザがコンストラクタを増やし、その処理を追記しなくても、確実にその処理が行われる

あー、こういう有用性もあるのかぁ・・と感じた先週でした

でも、なんのクラスも継承していないクラスを作成し、その中で上記を行おうとした場合・・方法はあるのだろうか
そういうデザインパターンがありそうだけど、知らない
singleton的なアプローチで出来そうかなぁと考えてみたものの、自分の技術力ではダメでしたとさ

良いやり方はないものか