S2JDBCによる不変オブジェクト活用

以前から S2JDBC を利用しています。

DTOとEntityを同じクラスにしたいため、public field は避けて JavaBeans にしていました。

最初、S2Dao と同じ感覚で各種アノテーションをアクセサに指定してたんですが、これが何故か動かない。

はて、と思って S2JDBC のコードを読んでみると、なんと直接 field を見てリフレクションでアクセス修飾子を無視して read/write を行っているではないですか。

一瞬違和感を感じましたが、よくよく考えればフレームワークですし問題ない気もします。それよりも見た目上 Entity を Immutable にできる事に大変強い魅力を感じました。

デフォルトコンストラクタを public で提供する必要がありますし、フィールドを final にすることはできませんが、class を final にして、getter だけを提供し、Mutableオブジェクト型のプロパティは防御的コピーに徹すれば、手で書くコード中では不変なオブジェクトとして扱うことができます。

値を設定したインスタンスが欲しい場合は Builderパターンを適用すればよさそうです。

これまでなるべくオブジェクトを Immutable にしたいと思ってもフレームワークが JavaBeans を要求しているためできないといった歯がゆさがありました。それが S2JDBC では堂々と不変オブジェクトを使うことができます。これは嬉しい。

問題はプレゼンテーション側のフレームワークが JavaBeans を要求している場合と、更新者名とか更新日時といった毎回手でセットするのは面倒なので AOP で設定しているプロパティの扱いをどうするか、といった点ですね。