生成器模式和持久性

ass*_*ias 8 java persistence design-patterns

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

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

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

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

一篇文章实际上指出这是Builder模式的一个特定缺点.

编辑

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

最终编辑

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

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

Dav*_*ton 6

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

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

  • 如果持久性框架使用反射来访问私有构造函数,那么它应该能够直接设置类字段.即使字段是最终的,这也有效. (3认同)
  • 如果字段不是最终字段,则有效.但如果它们是那么我出于显而易见的原因我不能使用默认构造函数/私有setter. (2认同)