JPAでは保存・復元時にプロパティ経由かフィールド経由か選べる。
オブジェクト指向の入門本を読むと、フィールドを直接使うよりプロパティを通してアクセスした方がフィールドアクセス時の必須操作を必ず実行させるように出来るので、自前でフィールドにアクセスするよりも遥かに安全。だからなるべくプロパティを使うように!と書いてある。…ので、ここもプロパティでしょ!と思ったら…。
プロパティの場合だと、publicとprotectedにしか使えない。これだとエンティティクラスのAPIを公開する時にそれらの部分も必ず公開される事になる。たとえ、それがエンティティの作成時刻の様にただ一度設定されるものであっても、再設定の機会をライブラリ使用者に与えてしまう。これはまずい…。ちなみにもっと酷い場合は以下の様になる。
/* 知ると消される国家機密. */
@Column(name="danger_info")
public String getDangerInfo() {
return dangerInfo;
}
/* 落書厳禁マフィアの隠れ家. */
public void setDangerInfo(String dangerInfo) {
this.dangerInfo = dangerInfo;
}
private String dangerInfo;
これではプログラマの命が幾つあっても足りない…。そんなこんなで、仕方なくフィールド経由にするか…と鬱々なる……けど、案外そっちのが妥当と気づいた。
てのはMementoパターン[Gof]がこれに似てる。Mementoパターンも保存復元の内部動作を担当するクラスに対しては保存情報(記念品:Memento)の中身へのアクセスを許可している。つまり、保存復元というテーマを扱う以上、通常の小さなインタフェースの他に、保存復元を担当する部分に提供するprivateでもアクセス出来るインタフェースを備えるのはごく自然な流れである。
一方、エンティティのフィールドにおいても、保存・復元を担うJPAはprivateでもアクセスするようになっている。つまり、先のMementoの例と似ている。しかもこの場合、JPAが直に元のprivateフィールドにアクセスするので記念品作りは必要ない。しかも、別にそのフィールドに新たなプロパティをかぶせてはいけないって事ではないのでロジック部分もきちんと作りこめる。というわけでJPAエンジンのアクセスはフィールド経由でしょっ!!て事になる。
ところが今度は…「じゃぁプロパティ版は何のためにあんの?」って疑問が出てくる。自分ではさっぱり分からなくなったので、サクッとググっとしてみると…
- Adam Bien's Weblog
- Property Based Access in JPA - is an Emerging Antipattern
発見!!…どうやらプロパティ版はアンチパターンだと…。ただ、必要になる場面もあるらしく、Detached状態にあるエンティティを値オブジェクトとして使う時とかがそれらしい。つまり、例え遅延ロードが有効になっていてManagedの時にロード(フェッチ)が行われてなくて、Detachedになっちゃっても取り敢えず何とかシリアライズ出来るよ言う事らしい。うーん、なるほど!!
てか最近ずーっと英語漬けなのに、ちっとも英語読むの上手くならない…日本語も結局中学生程度で止まってるし…。なんかもぅ、自分の語学の才能の無さにただただ驚くばかり…鬱。


