生成器模式和持久性

时间:2012-02-22 15:18:51

标签: java design-patterns persistence

我将Builder模式用于我项目的几个类(多个参数,一些是强制的,一些是可选的,等等)。这些类是不可变的(没有setter,集合getter的深层副本)。

我现在正尝试使用持久性框架将这些对象存储在数据库中,该框架使用默认构造函数+ setter构造对象。它不太喜欢我的建设者!

我不想将该设置降级为POJO并失去当前设计的优势(灵活性,不变性,构造安全性)。

我欢迎任何有关可以在这种情况下使用的变通方法的反馈(我可以包装这些类中的每一个,但这会使类的数量增加一倍,我宁愿避免这样做。)

一个post实际上指出这是Builder模式的一个特定缺点。

修改

一个answer建议使用私有构造函数/ setter,但只有在类的字段不是final时才有效,这不是我的情况。

最终编辑

感谢所有人。
我认为我的最终解决方案看起来像这样并且工作正常(为了记录,我正在使用MongoDB + Morphia):

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

1 个答案:

答案 0 :(得分:6)

正如我在评论中所说:你可以包含一个默认构造函数和所有必需的setter但是将它们设为私有。这样你就可以保持对象的不变性,但是像Hibernate这样的ORM可以在需要时访问方法/构造函数。

其他任何人都可以使用反射访问这些方法,但是他们也可以使用反射访问私有成员变量。因此,添加私有方法并没有真正的缺点。