上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

役に立ったらぽちっとよろしく。 人気ブログランキングへ

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になっちゃっても取り敢えず何とかシリアライズ出来るよ言う事らしい。うーん、なるほど!!

役に立ったらぽちっとよろしく。 人気ブログランキングへ


てか最近ずーっと英語漬けなのに、ちっとも英語読むの上手くならない…日本語も結局中学生程度で止まってるし…。なんかもぅ、自分の語学の才能の無さにただただ驚くばかり…鬱。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する

トラックバック
この記事のトラックバックURL
この記事へのトラックバック
Copyright © ふらふら技術者の日記 All Rights Reserved.
Powered by FC2 Blog
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。