2012-02-22 19 views
8

私は、私のプロジェクトのいくつかのクラス(複数の引数、いくつかの必須、いくつかのオプションなど)にBuilderパターンを使用します。これらのクラスは不変です(セッター、コレクションゲッターのディープコピー)。Builderのパターンと永続性

私は今、デフォルトのコンストラクタ+セッタでオブジェクトを構築する永続化フレームワークを使用して、これらのオブジェクトをデータベースに格納しようとしています。それは私のビルダーが大好きではありません!

私はその設定をPOJOに劣化させたくなく、現在の設計(柔軟性、不変性、建設安全性)の利点を失いたくありません。

この状況で使用できる回避策についてのご意見をお待ちしております(これらのクラスをそれぞれラップすることができますが、それはクラスの数を2倍にし、むしろ避けたいと思います)。

postは実際にビルダーパターンの具体的な欠点として指摘しています。

EDIT

一つanswerは、プライベートコンストラクタ/セッターを使用することを提案しているが、クラスのフィールドは私の場合されていない、最終でない場合ということにのみ機能します。

FINAL EDITすべての

感謝。

class AClass { 
    private final String aField; 
    private final AClass() { 
     aField = ""; 
    } 
    //Standard builder pattern after that - no setters (private or public) 
} 
+4

セッターとデフォルトのコンストラクタを含めずに非公開にすることはできませんか? – DaveJohnston

+0

良い質問 - 私はそれを確認します – assylias

+0

私はHibernateがプライベートセッターとコンストラクタを使用できることを知っています。 – DaveJohnston

答えて

6

私は私のコメントで言ったように:あなたは、デフォルトのコンストラクタを含めることができ、私は私の最終的な解決策は、次のようになりますと(記録のために、私はMongoDBの+ Morphiaを使用しています)正常に動作することになると思う何
必要なすべての設定者を非公開にしますこうすることで、オブジェクトの不変性を維持できますが、HibernateなどのORMは必要なときにメソッド/コンストラクタにアクセスできます。

誰もがリフレクションを使用してこれらのメソッドにアクセスできますが、リフレクションも使用してプライベートメンバー変数にアクセスできます。したがって、プライベートメソッドを追加することには実質的な欠点はありません。

+1

フィールドが最終的でない場合に機能します。しかし、それらの場合、私は明白な理由でデフォルトコンストラクタ/プライベートセッタを使用することはできません。 – assylias

+3

永続性フレームワークがリフレクションを使用してプライベートコンストラクタにアクセスする場合は、クラスフィールドを直接設定できる必要があります。フィールドが最終的であっても、これは機能します。 – TDJoe

+1

フィールドをfinalに設定することは明らかにObjectを変更不能にすることの一部ですが、Objectを変更するパブリックメソッドがない場合は、フィールドを最終的にする必要はありませんか?クラス内のメソッドで誤って値を変更しないようにする以外に、 – DaveJohnston